4

ユーザーが単一のオブジェクトまたは配列のいずれかになるオプションをメソッドに渡せるようにしたいと思います。`opts[:variable_length_opt] が定義されていると仮定すると、以下のコードが機能します。

def initialize(opts={})
  @ivar = *opts[:variable_length_opt]
end

ただし、オプションが設定されていない場合は、デフォルトを設定できるようにしたいと考えています。しかし、このコードは機能しません:

def initialize(opts={})
  @ivar = (opts[:variable_length_opt] ? *opts[:variable_length_opt] : default_value)
end

エラーがスローされunexpected tSTARます。私が求めていることを達成するための他のより詳細な方法があることは理解していますが、他に短い代替手段があるかどうか疑問に思っています。また、スプラットの限界は何ですか?ここで利用できない正当な理由は思いつきません。

4

2 に答える 2

7

スプラットは割り当てでのみ(そして間接的にはメソッド呼び出しで)利用できると思います。スプラットを直接呼び出すこともできません。

1.9.3p286 :045 > *[1,2,3,4]
SyntaxError: (irb):45: syntax error, unexpected '\n', expecting tCOLON2 or '[' or '.'
    from /Users/fcoury/.rvm/rubies/ruby-1.9.3-p286/bin/irb:16:in `<main>'

あなたの場合、あなたは次のようなことをすることができます:

def initialize(opts={})
  @ivar = *(opts[:variable_length_opt] ? opts[:variable_length_opt] : [default_value])
end

それはほとんど同じくらい短いです。

ただし、通常はスプラットを使用して、配列から複数の変数を割り当てます。

a = [1,2,3,4]
b, c, d, e = *a
b #=> 1
c #=> 2 ...

この場合、なぜスプラットが必要なのですか?

于 2012-11-10T03:51:50.220 に答える
0

opts実際に三項を使用する代わりに、ハッシュをデフォルト値で初期化できます-

class InitOptions
    attr_reader :ivar

    def initialize(opts=Hash.new("default_value"))
        @ivar = *opts[:variable_length_opt]
    end
end

p InitOptions.new({:variable_length_opt => [1,2,3,4]}).ivar #=> [1, 2, 3, 4]
p InitOptions.new.ivar # => ["default_value"]

ハッシュにキーが存在しない場合Hash.new("default_value")に返す代わりに、初期化するために渡した値を返します。この場合はnildefault_value

于 2012-11-10T05:17:45.113 に答える