0

OO Ruby のスキルを向上させようとしています。クラスを作成しましたが、それを呼び出して ans インスタンスを作成しようとすると、エラーが発生します。

これがコードです。

class EncapsulatedPerson
    def initialize(name)
        set_name(name)
    end

    def name
        @first_name + " "+ @last_name
    end

    def set_name
        first_name, last_name = name.split(/\s+/)
        set_first_name(first_name)
        set_last_name(last_name)
    end

    def set_first_name
        @first_name = name
    end

    def set_last_name
        @last_name = name
    end

end

上記の行に書き込んだファイルをロードし、このクラスのインスタンスを作成しようとすると

2.2.0 :004 > ep = EncapsulatedPerson.new('William Wallace')
ArgumentError: wrong number of arguments (1 for 0)
  ... # 

エラーからわかるように、新しいインスタンスを作成するときは引数を0つ渡す必要があります(ただし、def initialize(name) ...1つの(名前)引数が必要だと思います'

2.2.0 :003 > ep = EncapsulatedPerson.new
ArgumentError: wrong number of arguments (0 for 1)

私は完全に混乱しました。newメソッドをインスタンス化しようとするとき、メソッドにはいくつの引数が必要ですか? 1 つの引数または引数なし?

4

3 に答える 3

1

ああ、あなたのクラス定義は間違っています。変更set_first_nameしてset_last_nameメソッドをEncapsulatedPersonこのように変更してください。

def set_first_name(name)
    @first_name = name
end

def set_last_name(name)
    @last_name = name
end
于 2015-06-11T08:19:15.130 に答える
1

のエラーは、引数を受け入れないように宣言されているandメソッドnumber of arguments (1 for 0)が原因であると言えます。set_first_nameset_last_name

class EncapsulatedPerson
  # ...

    def set_first_name
        @first_name = name
    end

    def set_last_name
        @last_name = name
    end

end

それらを更新して、引数を受け入れるようにしてください。

class EncapsulatedPerson
  # ...

    def set_first_name(name)
        @first_name = name
    end

    def set_last_name(name)
        @last_name = name
    end

end

お役に立てれば!

編集

完全なコードは次のようになります。

class EncapsulatedPerson
  attr_reader :first_name, :last_name

  def initialize(name)
    set_name(name)
  end

  def name
    @first_name + " "+ @last_name
  end

  def set_name(name)
    first_name, last_name = name.split(/\s+/)
    set_first_name(first_name)
    set_last_name(last_name)
  end

  def set_first_name(name)
    @first_name = name
  end

  def set_last_name(name)
    @last_name = name
  end

end

epa = EncapsulatedPerson.new('William Wallace')
puts epa.first_name
于 2015-06-11T08:19:17.463 に答える
1

set_name初期化メソッドでは、 1つの引数を受け入れるメソッドを呼び出しています:

def initialize(name)
    set_name(name)
end

一方、set_nameメソッド定義は引数を受け入れません:

def set_name
    first_name, last_name = name.split(/\s+/)
    set_first_name(first_name)
    set_last_name(last_name)
end

メソッドは既にインスタンス メソッドとして作成されているため、設計nameどおりに、引数として に渡す必要はありませんset_name

ただし、以下に示すようにクラスを変更する必要があります。

問題を解決するには、次のようにクラスを変更します。

class EncapsulatedPerson
  def initialize(name)
    @first_name, @last_name = name.split(/\s+/)
    set_name(@first_name, @last_name)
  end

  def name
    @first_name + " "+ @last_name
  end

  def set_name(first_name, last_name)
    set_first_name(first_name)
    set_last_name(last_name)
  end

  def set_first_name(first_name)
    @first_name = first_name
  end

  def set_last_name(last_name)
    @last_name = last_name
  end

end
于 2015-06-11T08:40:38.503 に答える