将函数传递给没有括号参数的构造函数

时间:2019-07-20 10:51:42

标签: scala curly-braces

我可以在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 }

1 个答案:

答案 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)中使用表达式。