0

これが機能しない理由を教えてください。

以下のコードはstudent1とstudent2を正しく出力しますが、student3でclassメソッドを機能させることができません。

私がやろうとしているのは.create_with_species、species属性=を"Human"に指定してクラスメソッドを割り当てることだけです。

ただし、プログラムを実行すると、「ローカル変数またはメソッドsexが未定義です」というエラーが表示されます。私は初心者で、何を間違えたのか理解できません。

Initializeメソッドで「性別」を識別したので、などのクラスメソッド内で使用できるはずだと理解していましたcreate_with_species。クラスメソッドで性別を明示的に定義しようとしましたstudent.sex = sexが、それでも同じエラーが発生しました。

class Students

  attr_accessor :sex, :age, :species

  def self.create_with_species(species)
    student = Students.new(sex,age)
    student.species = species
    return student
  end

  def initialize(sex, age)
    @sex = sex
    @age = age
    puts "----A new student has been added----"
  end

end

student1 = Students.new("Male", "21")
puts student1.sex
puts student1.age
puts

student2 = Students.new("Female", "19")
puts student2.sex
puts student2.age

student3 = Students.create_with_species("human")
4

3 に答える 3

1

sexageは定義されていません。クラス変数を使用するつもりですか?クラス属性が設定されておらず、インスタンスがまだ作成されていないため、@ageまたはを使用するとnilsになります。したがって、インスタンス変数も設定されません。で@sex述べる必要はありません。 スコープがであるため、十分です。初期化するためにハッシュオブジェクトを渡して、そこに種変数を設定する方がよいと思います。明示的に割り当てられていない場合はnilになります。または、デフォルト値を使用できます。Students.newcreate_with_speciesnewStudents

これを試して:

class Students

  attr_accessor :sex, :age, :species

  def initialize(options)
    @sex = options[:sex]
    @age = options[:age]
    @species = options[:species]
    puts "----A new student has been added----"
  end

end

student1 = Students.new(:sex => "Male", :age => "21")
puts student1.sex
puts student1.age
puts student1.species
puts

student2 = Students.new(:sex => "Female", :age => "19")
puts student2.sex
puts student2.age

student3 = Students.new(
    :sex => "Hermi", :age => "2", :species => "alien"
)
于 2012-04-28T21:53:01.847 に答える
1

構文に関する限り、andの代わりにandを使用する必要@sex@ageありsexますage。そうしないと、インスタンス属性として解釈されません。

しかし、コードのロジックが壊れていることに気づいていますか?静的ファクトリメソッドパターンを使用したいことは理解していますが、これはその方法ではありません。そのメソッドを呼び出すと、これらの変数はクラス属性ではなくインスタンス属性であるため、nilになります@sex@age

于 2012-04-28T21:48:33.940 に答える
1

@sexおよび@ageはインスタンス属性です。クラスメソッド内でそれらを使用することはできません(それらはどういう意味ですか?)。あなたはちょうどsexそしてage内部create_with_speciesに書いたが、再び:これらは何を指すことになっているのか?(インスタンスメソッドでは、アクセサーへの呼び出しになりますが、この時点では、アクセサーを呼び出すインスタンスはありません。)

考えてみてください:あなたが言うとき

student3 = Students.create_with_species("human")

この新しい学生オブジェクトは何sexを取得する必要がありますか?age何も指定していません。

于 2012-04-28T21:55:23.797 に答える