2

変数が配列であるかどうかを確認する必要があります。そうでない場合は、さらに処理を進める前に、変数を配列に変換する必要があります。したがって、私のコードは次のようになります。

class Test < Struct.new(:args)
    def eval
        p "1. #{args}"
        args = (args.instance_of? Array) ? args : [args]
        p "2. #{args}" # woah! [nil]?
        # ...other things, with "args" being an array for sure..or not?!?
    end
end

私はルビーにまったく慣れていないので、おそらくこれはあまり慣用的ではありませんが、私にはこのコードは少なくとも機能するはずです。代わりに、2回目にargs変数を出力すると、です[nil]。メソッドをeval少し変更すると、次のことに注意してください。

def eval
    p "1. #{args}"
    a = args
    args = (a.instance_of? Array) ? a : [a]
    p "2. #{args}"
end

すべてが期待どおりに機能します。それで、私が理解できないStructクラスに非常に固有の何かがありますか、それともここで何か怪しいことが起こっていますか?(macosxでruby 1.9.3-devを使用し、rvmを使用)

4

1 に答える 1

2

実際、あなたがやろうとしていることにはRubyのイディオムがあります[*args]*このコンテキストでは、スプラット演算子と呼ばれます。

http://raflabs.com/blogs/silence-is-foo/2010/08/07/ruby-idioms-what-is-the-splatunary-operator-useful-for/

配列が渡されると、splatは配列を新しい配列に「フラット化」します。単一の引数を渡すと、1つの要素の配列になります。

args奇妙な振る舞いについては、メソッドでローカル変数を作成しているように見えます。これは、代入のLHS上にあるためにeval初期化されます。nil次に、は配列ではないため、3項はfalseと評価されargs、現在の値の配列を作成します。これはまだnilです。argsインスタンス変数( )の場合@args、期待どおりに機能します。つまり、Structwillから継承すると、メソッドargsとメソッドが提供されますが、インスタンス変数args=は提供されません。@args

于 2011-08-17T08:50:43.887 に答える