有人可以解释为什么以下不起作用.当我这样做时toSet,不知何故失去了编译类型推断的一些信息,但我不明白为什么.
scala> case class Foo(id: Int, name: String)
defined class Foo
scala> val ids = List(1,2,3)
ids: List[Int] = List(1, 2, 3)
scala> ids.toSet.map(Foo(_, "bar"))
<console>:11: error: missing parameter type for expanded function ((x$1) => Foo(x$1, "bar"))
ids.toSet.map(Foo(_, "bar"))
^
scala> ids.map(Foo(_, "bar")).toSet
res1: scala.collection.immutable.Set[Foo] = Set(Foo(1,bar), Foo(2,bar), Foo(3,bar))
Run Code Online (Sandbox Code Playgroud) 为什么以下代码会导致编译错误:
class MyImplicit
class FooTest extends ImplicitProvider {
def getImplicit(implicit i: MyImplicit) = i
getImplicit
}
trait ImplicitProvider {
implicit val myImplicit = new MyImplicit
}
Run Code Online (Sandbox Code Playgroud)
编译错误是:
could not find implicit value for parameter i: MyImplicit getImplicit
Run Code Online (Sandbox Code Playgroud)
如果我将特性ImplicitProvider移动到类FooTest之上,一切正常.
我用scala 2.11.7和sbt 0.13.9编译.
这是预期的行为还是一个错误?
我正在搜索图书馆从Scala发送Apple推送通知.
有没有人对使用Scala编写的库有任何经验?
或者是javaPNS(https://code.google.com/p/javapns/)最好选择?
我想为objective-c中的对象构建一个小插件系统.
现在我陷入了我想要动态地(在运行时)为对象中的每个可用功能添加一行代码的地步.
我已经玩过运行时库,但还没有找到解决方案.
到目前为止我尝试过的是:
id (^impyBlock)(id, id, ... ) = ^(id self_, id arguments, ...)
{
// My custom code for every function here
id (*func)(__strong id,SEL,...) = (id (*)(__strong id, SEL, ...))imp;
return func(obj, s, arguments);
};
id (*impyFunct)(id, SEL,...) = imp_implementationWithBlock(impyBlock);
method_setImplementation(mList[i], impyFunct);
Run Code Online (Sandbox Code Playgroud)
我的问题是,当有多个参数时,我没有机会将它们传递给"func()".AFAIK这在C中是不可能的.
我想到的另一个解决方案是通过方法调配来做一些魔术.
步骤:
在这个解决方案中,我陷入了第3点.我还没有设法动态创建一个完整的新方法.
有没有人可以帮助我解决上面的问题,或者有一个"捕获所有方法功能"的另一个解决方案.
最好的是类似forwardInvocation,它也捕获已经定义的函数.
谢谢你的帮助!
提供以下方案:
def add(a: Int, b: Int): Int = a + b
def f1(adder: () => Int) = adder()
f1(add(1,2) _) // Does **NOT** compile, because add seems to be already executed
f1(() => add(1,2)) // This works, but seems to be ugly
Run Code Online (Sandbox Code Playgroud)
有没有办法让它与下划线一起使用?
是否可以通过名称用字符串设置函数的参数.
例如:
给定:
def foo(a: String, b: String)
Run Code Online (Sandbox Code Playgroud)
我可以使用Map来动态调用此函数吗?
Map(("a", "bla"), ("b", "blub"))
Run Code Online (Sandbox Code Playgroud)
?
如果是这样,怎么样?
谢谢!
JavaDoc java.util.Collections.synchronizedList说如下
当迭代它时,用户必须手动同步返回的列表:
Run Code Online (Sandbox Code Playgroud)List list = Collections.synchronizedList(new ArrayList()); ... synchronized (list) { Iterator i = list.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next()); }不遵循此建议可能会导致非确定性行为.
现在我想知道当我使用它上面的.asScala函数时会发生什么.scala.collection.JavaConverters.map
转换器会在迭代期间处理同步还是我必须自己完成?