2016-09-13 6 views
0

私のモジュールでは、という名前のではなく、という異なる数の引数を持つ2つの関数を定義しました。別の関数で関数を呼び出すと、不明な引数がある

module MyMod 
def self.doTask(name:, age:) 
    doTask(name: "John", age: 30, career: "Teacher") 
end 

def self.doTask(name:, age:, career:) 
    puts "name:#{name}, age:#{age}, career:#{career}" 
end 
end 

あなたがdoTaskでは、上記参照したように、私はちょうどdoTaskを呼び出します。他のRubyファイルで

、私はでdoTaskを呼び出す:

MyMod.doTask(name:"Kate", age: 28) 

しかし、私はランタイムエラーを取得:

unknown keyword: career (ArgumentError) 

なぜ?

+0

このメソッドを呼び出すときには、実際には引数として1つのハッシュを渡しているだけです。 –

+1

@ sagarpandya82 no。これはキーワードの引数です。 https://robots.thoughtbot.com/ruby-2-keyword-arguments –

+0

@pascalbetzああ、ありがとう。 –

答えて

4

Rubyにはメソッドがオーバーロードされていません。同じ名前のメソッドを複数持つことはできません。

解決策の1つは、メソッドの3つの引数バージョンを使用し、:career引数の既定値を追加することです。

module MyMod 
    def self.doTask(name:, age:, career: "Teacher") 
    puts "name:#{name}, age:#{age}, career:#{career}" 
    end 
end 
MyMod.doTask(name:"Kate", age: 28) 
MyMod.doTask(name:"Kate", age: 28, career: 'Teacher') 
MyMod.doTask(name:"Kate", age: 28, career: 'Mechanic') 
+0

明確にするためにコードを入力してください。 Thanks –

+0

@ Leem.finが更新されました。 –

+0

nice!まさに私が欲しいものです。ありがとう。 –

2

Rubyは、careerパラメータを持つ2番目のメソッド定義がであるため、最初のメソッド定義をに置き換えてメソッドオーバーロード(同じ名前と異なるパラメータを持つ2つのメソッド)をサポートしていません。

次のようなオプションのパラメータのデフォルト値を提供することができます。指定されていない場合

def self.doTask(name:, age:, career: 'Employee') 
puts "name:#{name}, age:#{age}, career:#{career}" 
end 

、その後careerは、値に「従業員」を持つことになります。

nil

またはデフォルトと

def self.doTask(name:, age:, career: nil) 
    unless career.nil? 
    # doTask with career 
    else 
    # doTask without career 
    end 
end 

を処理するメソッド本体にいくつかのロジックが含まれますが、JavaやC#などの他の言語からRubyのに来ている場合は、同等の挙動はdoesnの理由をいくつかの素晴らしい洞察力がありますRubyにはthis answerに存在しません。

+0

ああ、よく知っておいてください。ありがとう。 –

関連する問題