2012-04-28 7 views
0

これはなぜ機能していないのですか?class methosd(ruby)

以下のコードはstudent1 & student2を正しく出力しますが、student3で動作するクラスメソッドを取得できません。

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

しかし、私がプログラムを実行すると、 "ローカル変数またはメソッドが定義されていません"というエラーが表示されます。私は初心者で、私が間違ったことを理解できません!

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") 

答えて

1

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

はこれを試してみてください:

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" 
) 
1

、あなたの代わりにsexage@sex@ageを使用する必要があります。それ以外の場合は、インスタンス属性として解釈されません。

しかし、コードのロジックが壊れていることは分かりますか?静的ファクトリメソッドパターンを使用したいと思っていますが、このメソッドを呼び出すときには@sex@ageはnilであり、これらの変数はクラス属性ではないインスタンス属性です。

1

@sex@ageは、インスタンスの属性です。クラスメソッドの中でそれらを使うことはできません(どういう意味ですか?)。 sexagecreate_with_speciesの中に書いていますが、これもまた何を指すのでしょうか? (インスタンスメソッドでは、彼らは、アクセサの呼び出しがあると思いますが、この時点で上のアクセサを呼び出すために何のインスタンスはありません。)

考えてみましょう:あなたは

student3 = Students.create_with_species("human") 

sexageこれがすべきと言ったときに新しい生徒のオブジェクトが得られますか?あなたは何も指定していません。

+0

ありがとう、私はそれを働かせます。しかし、今私は問題があります。私は以下の質問に受け入れた答えを見てください。その男は、(あなたの説明に基づいて)クラスメソッドを作ってはいけません... http://stackoverflow.com/questions/10366572/class-methods-ruby –

+0

私はあなたがなぜそれが '仕事。そのクラスメソッドは、必要なものを引数として取得し、特定のインスタンスに設定します。 –