标签: function-literal

如何定义一个函数,它将函数文字(带有隐式参数)作为参数?

我希望能够在这些行上做一些事情(不会编译):

def logScope(logger:Logger)(operation: (implicit l:Logger) => Unit) {/* code */ operation(logger) /* code */} 
def operationOne(implicit logger:Logger) {/**/}
def operationTwo(implicit logger:Logger) {/**/}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

logScope(new ConsoleLogger){logger =>
    operationOne
    operationTwo
    }
Run Code Online (Sandbox Code Playgroud)

但最接近我的工作解决方案是:

def logScope(logger:Logger)(operation: Logger => Unit) {/* code */ operation(logger) /* code */} 
def operationOne(implicit logger:Logger) {/**/}
def operationTwo(implicit logger:Logger) {/**/}

/* other code */

logScope(new ConsoleLogger){logger =>
    implicit val l = logger
    operationOne
    operationTwo
    }
Run Code Online (Sandbox Code Playgroud)

我不认为语言目前允许这样的结构,但仍然有任何建议或变通方法可以达到类似的结果吗?


次要更新:我已经创建了一个带有上述代码的略微扩展版本的要点,并尝试模拟这种文字.截至目前,CheatEx的版本是最好的.

parameters scala implicit function-literal

3
推荐指数
1
解决办法
1179
查看次数

有关Scala占位符的问题

请考虑Scala中的以下定义:

val f = ((_: Int) + 1).toString()
Run Code Online (Sandbox Code Playgroud)

代码为f指定函数文字_ + 1的字符串表示,这很自然,除了这不是我想要的.我打算定义一个接受int参数的函数,将其递增1,并返回其字符串格式.

要消除歧义,我必须编写一个带有显式参数的lambda表达式:

val g = (x: Int) => (x + 1).toString()
Run Code Online (Sandbox Code Playgroud)

那么我可以得出结论:占位符语法不适合复杂的函数文字吗?或者是否有一些规则说明函数文字的范围?似乎占位符不能嵌套在函数文字中的括号中(除了定义其类型所需的除外)

scala placeholder function-literal

3
推荐指数
1
解决办法
3012
查看次数

压缩集合上的Scala函数文字和占位符语法

我目前正在学习Scala,并且一直在努力在zipped集合上使用占位符语法.例如,我想从l2 [i]> = l1 [i]的项目中过滤压缩数组.如何使用显式函数文字或占位符语法执行此操作?我试过了:

scala> val l = List(3, 0, 5) zip List(1, 2, 3)
l: List[(Int, Int)] = List((3,1), (4,2), (5,3))

scala> l.filter((x, y) => x > y)
<console>:9: error: missing parameter type
Note: The expected type requires a one-argument function accepting a 2-Tuple.
      Consider a pattern matching anonymous function, `{ case (x, y) =>  ... }`
              l.filter((x, y) => x > y)
                        ^
<console>:9: error: missing parameter type
              l.filter((x, y) => x > y)

scala> …
Run Code Online (Sandbox Code Playgroud)

functional-programming scala function-literal pattern-matching

2
推荐指数
1
解决办法
447
查看次数

Scala函数中的占位符不适用于可变映射

我在Scala中有以下代码:

var queryMap = Map("name" -> "tim")
age_list.foreach { age => queryMap += ("age" -> age.toString) }
Run Code Online (Sandbox Code Playgroud)

如果我在函数中包含占位符,它会中断:

var queryMap = Map("name" -> "tim")
age_list.foreach { queryMap += ("age" -> _.toString) }   
Run Code Online (Sandbox Code Playgroud)

抛出以下错误:

value += is not a member of scala.collection.immutable.Map[String,String] 
Run Code Online (Sandbox Code Playgroud)

queryMap成为一个不可变的Map而不是一个可变的Map.我的语法结构有问题吗?

scala function function-literal

2
推荐指数
1
解决办法
70
查看次数

如何确定对象是使用对象文字还是对象构造函数调用创建的?

更具体地说,您如何确定某个对象是否是使用文字创建的?

var s1 = new String();
var s2 = ""; // Literal

var o1 = new Object();
var o2 = {}; // Literal

var f1 = new Function();
var f2 = function(){}; // Literal
Run Code Online (Sandbox Code Playgroud)

显然,如果你比较上面的任何两个,例如:

var o1 = new Object();
var o2 = {};

alert(o1 == o2);
alert(o1 === o2);

alert(typeof o1);
alert(typeof o2);
Run Code Online (Sandbox Code Playgroud)

...前两个警报将显示,false而最后两个警报将显示[Object object]

比方说,如果我想这样做:

function isLiteral(obj, type) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

......怎么会这样做呢?

已经看了如何确定一个对象是否是Javascript中的对象文字?,但它没有回答我的问题.

javascript function-literal object-literal string-literals

1
推荐指数
1
解决办法
163
查看次数

scala函数文字中的`return`

我正在尝试做这样的事情:

var fun : (Int,Int) => Double = (a,b) =>
{
  // do something
  return 1.0
}
Run Code Online (Sandbox Code Playgroud)

但是,我的IDE投诉Return statement outside method definition.那么如何在scala中的函数文字中显式地给出一个return语句呢?

functional-programming scala return function function-literal

1
推荐指数
2
解决办法
1634
查看次数