0

我想知道,是否有可能在 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 }

更新

我不是特别在谈论 put,它只是选择了它。可能有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
4

2 回答 2

3

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

但是,您可以通过反射显式获取对象。对象响应并喜欢任何响应的对象,因此可以像使用一元前缀运算符一样传递它们:MethodMethodto_procto_proc&

some_array.each(&method(:puts))
于 2013-07-25T11:01:14.273 回答
1

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

some_array.each &:print_myself

这相当于:

some_array.each {|x| x.print_myself}

但我不知道一种干净的(阅读:内置)方式来做你要求的事情。(编辑:@Jörg 的答案是这样做的,尽管它并没有真正为您节省任何打字。Ruby 中没有自动偏函数应用程序)

于 2013-07-25T05:41:21.243 回答