Ruby 如何对匿名对象进行装饰,以便使用&;怎么办?

Ruby 如何对匿名对象进行装饰,以便使用&;怎么办?,ruby,ruby-1.9,splat,arity,Ruby,Ruby 1.9,Splat,Arity,当method\u name需要多个对象时,我想使用&method(:method\u 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 o

method\u name
需要多个对象时,我想使用
&method(:method\u 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_文件([“foo.txt”,“foo_20110915.txt])
而不是
move_文件(“foo.txt”,“foo_20110915.txt”)

我该如何使其具有正确的算术

我知道的解决办法:

  • def move_文件(旧文件名、新文件名)
    替换为
    def move_文件(*参数)

  • 每个{|旧|文件名,新|移动|文件(旧|文件名,新|文件名)}
  • 反而

    each{|old_filename, new_filename| move_file(old_filename, new_filename)}
    
    你应该能做到

    each{|pair| move_file(*pair)}
    
    但我不知道你们是如何实现无块变体的(我也需要它好几次)。我猜&-shorthand是为了使语法更简单,也不意味着会被阻塞太多(例如,它是作为数组传递数组,还是被飞溅)

    我该如何使其具有正确的算术

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

    将_从_移动到=Proc.new{|*两个|移动_文件(*两个)}

    问题是-块和过程是Ruby 1.9中解决的问题,因此可能会有不同的行为。另请参见此处的
    prc.lambda?
    ,了解它对算术运算的影响


    这个问题也与你想做什么有关(解决方法是手动重新调整和取消调整):

    你说的“阻塞”是什么意思?对不起,英语不是我的母语。。。我的意思是,无论您是否希望数组被飞溅,您都需要以某种方式传递信息,即在
    &方法(:name)
    参数周围使用一些附加语法。一度简洁的
    &
    -风格可能会变得笨重且不可读,因此其好处变得值得怀疑。