2012-04-28 2 views
0

이것이 작동하지 않는 이유를 말해 줄 수 있습니까?class methosd (ruby)

아래 코드는 student1 & student2를 올바르게 출력하지만 student3에서 작동하는 클래스 메서드를 가져올 수 없습니다.

나는 종 속성이 "Human"인 클래스 메소드 .create_with_species을 할당하려고합니다.

그러나 프로그램을 실행하면 "로컬 변수 또는 메서드 sex이 정의되지 않았습니다."라는 오류가 발생합니다. 나는 초보자이고 내가 뭘 잘못했는지 알 수 없다!

Initialize 메서드에서 "sex"를 식별 했으므로 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

sexage은 정의되지 않는다. 클래스 변수를 사용 하시겠습니까? @age 또는 @sex을 사용하면 클래스 속성이 설정되지 않고 인스턴스가 아직 작성되지 않으므로 nils가됩니다. 따라서 인스턴스 변수도 설정되지 않습니다. Students.newcreate_with_species에 기재 할 필요는 없습니다. 에 범위가 있기 때문에 new이면 충분합니다. 난 당신이 초기화 해시 개체를 전달하는 것이 더 좋을 것이라고 생각하고 거기에 종 변수를 설정합니다. 명시 적으로 지정하지 않으면 nil이되거나 기본값을 가질 수 있습니다.

이 시도 :

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

지금까지 구문이가는대로, 당신은 @sex@age 대신 sexage를 사용해야 . 그렇지 않으면 인스턴스 속성으로 해석되지 않습니다.

하지만 코드의 논리가 깨져 있다는 것을 알고 있습니까? 정적 팩터 리 메서드 패턴을 사용하고 싶지만이 메서드를 호출 할 때 @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

왜 그렇게 생각하지 않을지 모르겠군요. 일하지 마라. 이 클래스 메소드는 필요한 것들을 인수로 가져온 다음 특정 인스턴스에 설정합니다. –