1. ホーム
  2. ruby

[解決済み] Ruby で initialize コンストラクタをオーバーロードする方法はありますか?

2023-05-31 08:24:39

質問

Javaでは、コンストラクタをオーバーロードすることができます。

public Person(String name) {
  this.name = name;
}
public Person(String firstName, String lastName) {
   this(firstName + " " + lastName);
}

Rubyでこれと同じ結果、つまり異なる引数を取る2つのコンストラクタを実現する方法はありますか?

どのように解決するのですか?

答えは「はい」と「いいえ」の両方です。

などのさまざまなメカニズムを使用して、他の言語と同じ結果を得ることができます。

  • 引数のデフォルト値
  • 変数引数リスト (スプラット演算子)
  • 引数をハッシュで定義する

実際の言語の構文では、引数が異なる場合でも、メソッドを2回定義することはできません。

上記の3つのオプションを考慮すると、これらはあなたの例で次のように実装することができます。

# As written by @Justice
class Person
  def initialize(name, lastName = nil)
    name = name + " " + lastName unless lastName.nil?
    @name = name
  end
end


class Person
  def initialize(args)
    name = args["name"]
    name = name + " " + args["lastName"] unless args["lastName"].nil?
    @name = name
  end
end

class Person
  def initialize(*args)
    #Process args (An array)
  end
end

Rubyのコード、特にRailsのコードでは、2番目のメカニズムによく遭遇します。これは両方の長所を備えており、きれいなコードを生成するための構文上の工夫が可能で、特に渡されたハッシュを中括弧で囲む必要がないためです。

これは wikibooksリンク は、さらにいくつかの読み物を提供しています。