4

&method(:method_name)当. 需要多个对象时,我想使用这个成语method_name。我可以在 Ruby 1.9 下执行此操作吗?

例如,如果我有

def move_file(old_filename, new_filename)
  STDERR.puts "Moving #{old_filename.inspect} to #{new_filename.inspect}"
  # Implementation for careful moving goes here
end

old_filenames = ["foo.txt", "bar.txt", "hoge.ja.txt"]
new_filenames = ["foo_20110915.txt", "bar_20110915.txt", "hoge_20110915.ja.txt"]

编码

old_filenames.zip(new_filenames).each(&method(:move_file))

在 Ruby 1.8 下工作,但不能在 Ruby 1.9 下工作。在 Ruby 1.9 下,它试图move_file(["foo.txt", "foo_20110915.txt"])代替move_file("foo.txt", "foo_20110915.txt").

我如何对其进行 splattify 以使其具有正确的数量?

我知道的解决方法:

  1. 替换def move_file(old_filename, new_filename)def move_file(*arguments)
  2. 替换each(&method(:move_file))
    each{|old_filename, new_filename| move_file(old_filename, new_filename)}
4

2 回答 2

1

反而

each{|old_filename, new_filename| move_file(old_filename, new_filename)}

你应该能够做到

each{|pair| move_file(*pair)}

但我不知道你将如何实现无块变体(我也需要它几次)。我猜 &-shorthand 是为了使语法更简单,并且不会被太多阻塞(例如,它是否会作为数组传递给数组,或者是 splatted)。:)

于 2011-09-15T05:04:13.837 回答
0

我如何对其进行 splattify 以使其具有正确的数量?

我认为没有办法在兼容两个 Ruby 版本的同时做到这一点。你能做的就是把它包装成一个 lambda

move_from_to = Proc.new {|*两者| move_files(*两者) }

问题是 - 块和 proc arity 是在 Ruby 1.9 中得到解决的,所以那里的行为可能会有所不同。另请参阅prc.lambda?此处http://www.ruby-doc.org/core/classes/Proc.html了解它对 arity 的作用。

这个问题也与您想要做的事情有关(解决方案是手动重新排列和解开):Hash.each 和 lambdas 之间的arity 不一致

于 2011-09-15T09:31:15.853 回答