我希望能够在这些行上做一些事情(不会编译):
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的版本是最好的.
请考虑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,并且一直在努力在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
我在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.我的语法结构有问题吗?
更具体地说,您如何确定某个对象是否是使用文字创建的?
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中的对象文字?,但它没有回答我的问题.
我正在尝试做这样的事情:
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