2

名前付きパラメーターが期待どおりに機能しないのはなぜだろうか。

 def my_method(var1, var2 = 1, var3 = 10)
   puts var1, var2, var3
 end

my_method(999, var3 = 123)

出力

999
123
10

代わりに(少なくとも、そうあるべきだと思います):

999
1
123

では、名前付きパラメーターを使用するにはどうすればよいでしょうか?

PSハッシュを使用すると、まだ探しているものではありません:

def my_method(var1, vars = {var2: 1, var3: 10} )
   puts var1, vars[:var2], vars[:var3]
 end

my_method(999, var3: 123)

999

123


my_method(999, var2: 111, var3: 123)

999
111
123



my_method(999)
999
1
10

したがって、各値をvarsオーバーライドするか、まったくオーバーライドしない必要があります。もっと便利な方法はありますか?

4

5 に答える 5

2

指摘したように、Rubyにはキーワード引数がありません(まだ、2.0で提供されます)。あなたがやろうとしていることを達成するために、optionsハッシュは非常に一般的なRubyイディオムです。

def my_method(var1, options = {})
  var2 = options.fetch(:var2, 1)
  var3 = options.fetch(:var3, 10)

  puts var1, var2, var3
end

my_method(999)
# => 999, 1, 10

my_method(999, var3: 123)
# => 999, 1, 123

my_method(999, var2: 111)
# => 999, 111, 10

my_method(999, var2: 111, var3: 123)
# => 999, 111, 123

my_method()
# => ArgumentError: wrong number of arguments (0 for 1)

偽の値(つまり、 )を明示的に指定できるため、options.fetch(:key, default)ではなくを使用することをお勧めします。options[:key] || defaultfalsenil

options = {x: nil, y: false}

x = options[:x] || 42      # sets x to 42
x = options.fetch(:x, 42)  # sets x to nil

y = options[:y] || 43      # sets y to 43
y = options.fetch(:y, 43)  # sets y to false

z = options[:z] || 44      # sets z to 44
z = options.fetch(:z, 44)  # sets z to 44

デフォルト値の計算を延期できるブロックを渡すこともfetchできます。

options.fetch(:x) { some_expensive_calculation }
# some_expensive_calculation is only called if necessary
于 2013-01-04T09:28:38.200 に答える
1

Ruby 2.0.0がリリースされ、名前付きパラメーターを使用できるようになりました。

def my_method(var1, var2: 1, var3: 10)
   puts var1, var2, var3
end

my_method(999, var3: 123)

結果:

999
1
123

または別の例:

def foo(str: "foo", num: 100)
  [str, num]
end

p foo(str: 'buz', num: 1) #=> ['buz', 1]
p foo(str: 'bar') # => ['bar', 100]
p foo(num: 2) # => ["foo", 2]
p foo # => ['foo', 100]
p foo(bar: 'buz') # => ArgumentError
于 2013-02-25T11:04:08.907 に答える
1

これを使用できます

  def my_method(options = {})
   puts options[:var1] || ''
   puts options[:var2] || ''
   puts options[:var3] || ''
  end

を使用して呼び出す

my_method(var1:999, var3: 123)

また

my_method(var1:999)
于 2013-01-04T08:51:26.427 に答える
1

次のようなもので遊ぶこともできます。

def method(data)
    defaults = {var2: 1, var3: 10}
    (@var1, @var2, @var3) = defaults.merge(data).values_at(:var1, :var2, :var3)
    p @var1, @var2, @var3
end

method(var1: 999, var3: 123)
于 2013-01-04T13:56:11.790 に答える