省略块中方法的参数

时间:2013-07-25 05:33:01

标签: ruby scala

我想知道,是否可以在Ruby中执行类似于Scala或其他语言的操作:

someCollection.foreach(x => println(x)) // a full version
someCollection.foreach(println) // a short version

在Ruby中,我可以做到:

some_array.each { |x| puts x }

那我怎么能这样做呢?

some_array.each { puts }

更新

我不是在谈论特别是,它只是选择了它。可能有some_other_method ,其中包含一个参数

some_array.map { some_other_method }
some_array.map(some_other_method) # ???

def some_other_method a
   # ... doing something with a
end

2 个答案:

答案 0 :(得分:3)

如果你在SLS(第6.26.5节)中查找隐式η-扩展的规则,那么它应该立即明显地依赖于静态类型信息,因此不可能在Ruby中工作。

可以,但通过反射明确获取Method个对象。 Method个对象响应to_proc,因此响应to_proc的任何对象都可以像使用一元前缀&运算符的块一样传递:

some_array.each(&method(:puts))

答案 1 :(得分:1)

不幸的是,不太喜欢这样。您可以在每个对象上发送要调用的方法名称,例如:

some_array.each &:print_myself

相当于:

some_array.each {|x| x.print_myself}

但我不知道干净(读取:内置)方式来做你想要的。 (编辑:@Jörg的答案是这样做的,虽然它并没有真正为你节省任何打字。在Ruby中没有自动部分功能应用程序)