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 では動作しません。move_file(["foo.txt", "foo_20110915.txt"])Ruby 1.9 では、 の代わりに実行しようとしています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)}
4

2 に答える 2

1

その代わり

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

あなたができるはずです

each{|pair| move_file(*pair)}

しかし、ブロックレスバリアントをどのように実行するかはわかりません(私も数回必要でした)。&-省略形は構文を単純にするために作成されたものであり、あまり目詰まりすることを意図したものではないと思います(たとえば、配列として配列が渡されるか、飛び散るか)。:)

于 2011-09-15T05:04:13.837 に答える
0

正しいアリティを持つように分割するにはどうすればよいですか?

Ruby の両方のバージョンと互換性を保ちながらこれを行う方法はないと思います。あなたができることは、それをラムダにラップすることです

move_from_to = Proc.new {|*両方| move_files(*両方) }

問題は - block と proc のアリティは Ruby 1.9 で対処されたものなので、動作に違いがあるかもしれません。それがアリティに対して何をするかについての情報については、prc.lambda?ここhttp://www.ruby-doc.org/core/classes/Proc.htmlも参照してください。

この質問は、あなたがやりたいことにも関連しています (手動で resplat と unsplat するための解決策があります): Inconsistency of aity between Hash.each and lambdas

于 2011-09-15T09:31:15.853 に答える