メソッドの最初の引数をオプションとして設定し、その後に任意の数の引数を設定しようとしています。例えば:
def dothis(value=0, *args)
私が遭遇している問題は、これが実際には可能ではないように見えるということですか?電話をかけるdothis("hey", "how are you", "good")
と、値がデフォルトの0に設定されることを期待していましたが、代わりに。を作成しているだけvalue="hey"
です。この動作を実現する方法はありますか?
メソッドの最初の引数をオプションとして設定し、その後に任意の数の引数を設定しようとしています。例えば:
def dothis(value=0, *args)
私が遭遇している問題は、これが実際には可能ではないように見えるということですか?電話をかけるdothis("hey", "how are you", "good")
と、値がデフォルトの0に設定されることを期待していましたが、代わりに。を作成しているだけvalue="hey"
です。この動作を実現する方法はありますか?
これはRubyでは直接不可能です
ただし、拡張パラメータで何をしているか、およびメソッドの目的に応じて、多くのオプションがあります。
明らかな選択は
1)ハッシュ構文を使用して名前付きパラメーターを取得する
def dothis params
value = params[:value] || 0
list_of_stuff = params[:list] || []
Rubyには、これに関する優れた呼び出し規約があります。ハッシュ{}ブラケットを指定する必要はありません。
dothis :list => ["hey", "how are you", "good"]
2)値を最後に移動し、最初のパラメーターの配列を取得します
def dothis list_of_stuff, value=0
このように呼ばれます:
dothis ["hey", "how are you", "good"], 17
3)コードブロックを使用してリストを提供します
dothis value = 0
list_of_stuff = yield
このように呼ばれる
dothis { ["hey", "how are you", "good"] }
4)Ruby 2.0では、上記のオプション1の多くを処理する名前付きハッシュパラメーターが導入されました。
def dothis value: 0, list: []
# Local variables value and list already defined
# and defaulted if necessary
(1)と同じように呼ばれます:
dothis :list => ["hey", "how are you", "good"]
この投稿は少し古いですが、誰かがそのための最良の解決策を探しているなら、私は貢献したいと思います。ruby 2.0以降、ハッシュで定義された名前付き引数を使用してこれを簡単に行うことができます。構文は簡単で読みやすくなっています。
def do_this(value:0, args:[])
puts "The default value is still #{value}"
puts "-----------Other arguments are ---------------------"
for i in args
puts i
end
end
do_this(args:[ "hey", "how are you", "good"])
次のように、貪欲なキーワード**argsをハッシュとして使用して同じことを行うこともできます。
#**args is a greedy keyword
def do_that(value: 0, **args)
puts "The default value is still #{value}"
puts '-----------Other arguments are ---------------------'
args.each_value do |arg|
puts arg
end
end
do_that(arg1: "hey", arg2: "how are you", arg3: "good")
これを実現するには、名前付きパラメーターを使用する必要があります。
def dothis(args)
args = {:value => 0}.merge args
end
dothis(:value => 1, :name => :foo, :age => 23)
# => {:value=>1, :name=>:foo, :age=>23}
dothis(:name => :foo, :age => 23)
# => {:value=>0, :name=>:foo, :age=>23}
value = 0を使用すると、実際には値に0が割り当てられます。値を保持するためだけに、上記のソリューションを使用するか、このメソッドdef dothis(value、digit = [* args])を呼び出すたびに値を使用することができます。
引数が指定されていない場合は、デフォルトの引数が使用されます。
私は同様の問題に遭遇し、以下を使用してそれを克服しました:
def check(value=0, digit= [*args])
puts "#{value}" + "#{digit}"
end
次のようにcheckを呼び出すだけです。
dothis(value, [1,2,3,4])
あなたの値はデフォルトになり、他の値は他の引数に属します。