• ベストアンサー

メソッド定義の際の引数で

楽しいRuby第4版のp.120で def a(a, b: 0, c:0)  [a, b, c] end のように、必須の引数とキーワード引数を混在 させることができると説明があったので試しに def meth(a, b: 2, c: 3, *args)  [a, b, c, args] end p meth(1,2,3) のように、必須の引数とキーワード引数と不定の 引数を混在させたところエラーが返りました。 やはり、不定の引数*argsまで混在させられないの でしょうか? irbで試すとメソッド定義をendで括った瞬間に エラーが返りましたんで、きっとこれが原因だと 思うのですが。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2
noname#208914
質問者

お礼

生意気すいませんでした。*argsは可変長引数という正式名称なんですね。 http://techracho.bpsinc.jp/baba/2013_02_25/6545 こちらの方の可変長引数とデフォルト引数とキーワード引数を組み合わせるという項目の def test2(id, type='normal', *friends, name: 'unknown', age: 0)  puts "name=#{name}, age=#{age}, type=#{type}"  puts "id=#{id} friends=#{friends}" end これを試したところ、うまく走りました。 原因がわかりました。 メソッドの引数を定義するときに可変長引数よりキーワード引数を前に出しては いけないという順番の法則みたいなのが存在するようです。 質問の例のdef meth(a, b: 2, c: 3, *args)という部分を(a, *args, b: 2, c: 3) という風に書きかえると、うまく走りました。 デフォルト引数も可変長引数も同じ必須パラメーターとすれば、順位的に必須 パラメーターが先にきてその後にキーワード引数の指定と続くんでしょうか。 せっかく答えて頂いて、不快な思いをさせてしまっていたら申し訳なかったです。 謎が解けました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ちょっと調べた限りでは「混在させること」はできるみたいだね.

noname#208914
質問者

補足

私がやってみた例で例えば def addition(a, b: 1, c: 2, **args)  abc = a+b+c  num = 0  args.each do |key, value|   num += value  end end p addition (1, b: 2, c: 3, d: 4, e: 5) なんて具合にするとちゃんと走り予想通り 戻り値が15と返ってきました。 不定のキーワード引数なら混在して指定 できるみたいです。 >ちょっと調べた限りでは「混在させること」はできるみたいだね. そのやり方は教えていただけないんですか? 結構自分でも色々試しているんですが、教える 気にならないなら、別にいちいち回答いただか なくても結構ですが。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • オープンクラスで再定義時に別で定義されたメソッドの

    オープンクラスで再定義時に別で定義されたメソッドの呼び出しについてです。 ある編集不可能なクラス Hoge の fuga メソッドの戻り値によって、新たなメソッド piyo を定義したいと考え、次のコードを試してみました。 irb(main):001:0> class Hoge irb(main):002:1> def fuga irb(main):003:2> 1 irb(main):004:2> end irb(main):005:1> end => :fuga irb(main):006:0> irb(main):007:0* class Hoge irb(main):008:1> if self.fuga == 1 irb(main):009:2> def piyo irb(main):010:3> puts "foobarbaz" irb(main):011:3> end irb(main):012:2> end irb(main):013:1> end NoMethodError: undefined method `fuga' for Hoge:Class from (irb):8:in `<class:Hoge>' from (irb):7 from /usr/bin/irb:11:in `<main>' この目的の場合、8~12行目はどのような記述をすれば良いのでしょうか。 なお、Hoge のインスタンス作成後に特異メソッドとして piyo を追加のが都合上、難しい状態です。 バージョンは ruby 2.1.5p273 です。 よろしくお願いします。

    • ベストアンサー
    • Ruby
  • rubyでメソッド内で引数名、値を取得

    Rubyでメソッドの引数名をメソッド内部で取得するような事は可能でしょうか? def hoge(a,b,c) # ここでa,b,cの引数名、またその値を取得 # 例えば、{:a=>1, :b=>2, :c=>3}のようにHashの形式で得るなど。 end local_variablesだと、引数も含まれますがその他で定義したものも拾ってしまうため、他の方法を探しています。 わかる方がいれば教えていただけますでしょうか。

  • メソッドが定義されるタイミングについて

    メソッドが定義されるタイミングについて ケース1 # 1 p cal(3) def cal(num) 1 + num end #2 p cal(3) ケース2 class test def cal(num) 1 + num end #3 p cal(3) end test = Test.new ケース1、2を通して、#2以外はcal()のメソッドが定義されていません。とい うエラーがでます。 なぜ#2のpだけは実行されて他のものは実行されないでしょうか。

    • ベストアンサー
    • Ruby
  • 引数に関して

    例えば、 C,B(C),A(B)という3つの関数があるとき、 それぞれをfunctionで書こうとすると、 Bの引数は-(C) Aの引数は-(B) でいいのでしょうか!? Aのルーチンには見た目上Cはでてこないので(CはBに包括されているため)、引数はBだけでいいのでしょうか?(☆部分) 説明不足で伝わっていないといけないので、サンプル載せときます。 ☆ function func_A(B) or (B,C) implicit none real*8 func_A,func_B,B,val * B=funcB(C) * val=(1.0d0-B)*3.0d0+B*7.0d0 func_A=val return end ------------------------------------- function func_B(C) implicit none real*8 func_B,func_C,C,val * C=func_C * val=C+5.0d0 func_B=val return end ---------------------------------- function func_C implicit none real*8 val * val=3.0d0 func_C=val return end ------------------------- Aの引数としてCも載せるのが正しい気がしますが、自信がありません。ご意見聞かせて下さい。

  • Ruby 同じ名前のメソッド

    始めましてよろしくお願いします。 さっそくなんですが Rubyで class A def dash( a, b ) end def dash( a ) end end というような使い方をしたいのですが どのように書けばいいのでしょうか? ちなみにこの書き方だと、後に書いた dash( a ) の方だけが有効になりました。

  • 自作したメソッド・・・引数はなるべく省略すべき?(VB2005)

    自作したメソッドに関して、引数はなるべく設定するべきでしょうか?それとも、引数は省略できるなら省略したほうがよいでしょうか? 下記(a)、(b)は例です。 a)引数はなるべく省略   ---------------------------------   Private Sub hoge()     Call foo()   End Sub   Private Sub foo()     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     '処理   End Sub   --------------------------------- b)あえて引数を設定   ---------------------------------   Private Sub hoge()     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     Call foo(hoga)   End Sub   Private Sub foo(ByVal hoga As integer)     '処理   End Sub   --------------------------------- 現在、(b)のようにあえて引数を設定したほうが、呼び出し先のメソッドがどういう処理を行っているかを掴めていいかな?と考え始めています。 ご助言よろしくお願い致します。

  • サブルーチンに引数を2つ以上渡したい

    Access2002、vba上で サブルーチンに引数を2つ指定したいのですが、 なぜか「コンパイルエラー 修正候補=」 と出てしまいます。 引数を1つにするとうまく動作します。 どなたかお分かりの方いらっしゃいましたら教えて ください。 宜しくお願いします。 サンプルコード: -------------------------------- the_subroutine(a, b) ' ※ここでコンパイルエラー Sub the_subroutine(c As String, d As Object) End Sub -------------------------------

  • 引数付自作関数において、引数を送らない場合について

    こんにちは。 makecolumn(a,b,c)という 自作関数があったとします。 ここで、 aとcにのみ、引数をおくり、 bは、デフォルト値を使いたいと 思います。 この場合、 makecolumn(30,,40) のようにすると、 どうも、エラーになってしまいます。 プログラム側では、 bの値について、 makecolumn=function(a,b,c){ if(b==null || b==''){ b=デフォルト値; } } としていますが、うまくいきません。 引数があるのに、空白で送ってきた場合に、 その状態を取得するには、 どうしたらいいのでしょうか。 よろしくお願いします。

  • Vectorを引数としたメソッド

    今回、初めてVectorを使ったプログラミングをしているのですが、どうしてもエラーの原因がわからないので質問します。ベクターと整数を引数としたメソッドを作っているのですが、このメソッドの bwEmployeeInfo.write(vPassedVector.get(nCounterFor)); で「Cannot Resolve Symbol」というメッセージが出ています。何か思い当たることがあれば教えていただけるとうれしいです。念のためエラーメッセージを最後につけておきます。 よろしくお願いします。 public void writeEmployees(Vector vPassedVector, int nPassedNumber) { BufferedWriter bwEmployeeInfo = null; if (vPassedVector.get(0) != null) { //Open a.dat File(o) try { bwEmployeeInfo = new BufferedWriter(new FileWriter("c:/a.dat")); ; System.out.println("error opening output file"); //Print detail line to a.dat file for (int nCounterFor = 0; nCounterFor < nPassedNumber; nCounterFor ++) { //ここでエラーがおきています。 bwEmployeeInfo.write(vPassedVector.get(nCounterFor)); bwEmployeeInfo.newLine(); } //end for bwEmployeeInfo.flush(); } //end try catch (IOException ioe) { System.out.println("error writing output file"); } } //end if } //end method エラーメッセージは以下。 cannot resolve symbol symbol : method write (java.lang.Object) location: class java.io.BuffredWriter bwEmployeeInfo.write(vPassedVector.get(nCounter));

    • ベストアンサー
    • Java
  • VBScriptで引数を省略したい場合

    VBScript の Function、Sub プロシージャで引数を省略したい場合、Optional キーワードが使えないので、空文字を渡すようにしていますが、これは言語仕様的に正しいやり方でしょうか? Sub MyProc(ByVal a, ByVal b) . . . End Sub Call MyProc(a, "")   '← 引数 b は状況に応じて省略したい。 よろしくお願いします。