我可以在scala中编写以下内容
def foo[P1, P2, R](f: (P1, P2) => R) = {}
val x = foo { (i: Int, j: Int) => i + j }
但是说我想在构造函数中做类似的事情:
class C[P1, P2, R](f: (P1, P2) => R) {
def apply(p1: P1, p2: P2): R = f(p1, p2)
}
然后定义C类型的对象,我需要执行以下操作才能编译:
object MyObj extends C( { (i: Int, j: Int) => i + j })
为什么需要括号,有什么办法可以避免使用括号并因此定义对象:
object MyObj extends C { (i: Int, j: Int) => i + j }
答案 0 :(得分:3)
简单的答案是,您可以省略$params = [
'path' => ':path',
'name' => ':name',
'size' => ':size',
'mimeType' => ':mineType',
];
$sql = "INSERT INTO filesSrc ( " . implode(',', array_keys($params)) . ") VALUES (" . implode(',', $params) . ")";
$amount = count($files);
$dbArrs = [];
for($i=0; $i<$amount; $i++){
$dbArrs[] = [
'path' => (string) dirname( $files[$i] ),
'name' => (string) basename( $files[$i] ),
'size' => (int) filesize($files[$i]),
'mimeType' => (string) mime_content_type( $files[$i] ),
];
}
new sql();
#todo It is recommended to use 'try catch'
$q = sql::$db->prepare($sql);
foreach ($dbArrs as $dbArr) {
foreach ($params as $key => $param) {
$q->bindParam($param, $dbArr[$key]);
}
$q->execute();
}
而不是省略{}
,如下所示:
()
更长的答案是,编写object MyObj extends C( (i: Int, j: Int) => i + j )
而不是foo{x}
的能力特定于函数应用程序,而不适用于构造函数。详细信息为here,但是在应用带有单个参数的函数时,基本上可以在foo(x)
中使用表达式。