Как я могу splattify анонимный объект, чтобы я мог использовать & метод на нем? - PullRequest
4 голосов
/ 15 сентября 2011

Я хочу использовать идиому &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").

Как мне его разделить, чтобы он имел правильную арность?

Обходные пути, о которых я знаю:

  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)}

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

Вместо

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

Вы должны быть в состоянии сделать

each{|pair| move_file(*pair)}

Но я не знаю, как бы вы выполнили безблочный вариант (он мне тоже понадобился пару раз). Я предполагаю, что & -shorthand был сделан, чтобы упростить синтаксис, и он не должен сильно засоряться (будет ли он передан массивом как массив или, например, разбит) :)

0 голосов
/ 15 сентября 2011

Как мне его разделить, чтобы он имел правильную арность?

Я не думаю, что есть способ сделать это, будучи совместимым с обоимиРубиновые версии.Что вы можете сделать, это обернуть его в лямбду

move_from_to = Proc.new {| * both |move_files (* оба)}

Дело в том, что блоки и про-арность - это то, что было решено в Ruby 1.9, поэтому там может быть различие в поведении.Также см. prc.lambda? здесь http://www.ruby -doc.org / core / classes / Proc.html для получения информации о том, что она делает с arity.

Этот вопрос также связан с тем, чтоВы хотите сделать (решение есть, чтобы перераспределить и распаковать вручную): Несоответствие арности между Hash.each и lambdas

...