类方法(红宝石)

时间:2012-04-28 21:44:46

标签: ruby class-method

你能告诉我为什么这不起作用吗?

以下代码输出student1& student2正确,但我无法让class3方法在student3上工作。

我要做的就是分配一个类方法.create_with_species,其中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")

3 个答案:

答案 0 :(得分:1)

就语法而言,您必须使用@sex@age而不是sexage。否则,它们不会被解释为实例属性。

但你确实意识到代码的逻辑被破坏了吗?我知道你想使用静态工厂方法模式,但这不是你应该怎么做的,因为当你调用那个方法时@sex@age是nil,而那些变量是实例属性而不是类属性。

答案 1 :(得分:1)

sexage未定义。你的意思是使用类变量吗?使用@age@sex将导致nils,因为没有设置类属性并且尚未创建实例,因此也没有设置实例变量。您无需在Students.new中说明create_with_speciesnew就足够了,因为你的作用范围是Students。我认为你最好将哈希对象传递给初始化,并在那里设置种类变量。如果未明确指定,它将为零,或者您可以具有默认值。

试试这个:

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

答案 2 :(得分:1)

@sex@age是实例属性。你不能在类方法中使用它们(它们意味着什么?)。您只在sex内写了agecreate_with_species,但是又一次:这些应该引用什么? (在实例方法中,他们将调用访问器,但此时没有实例调用访问器。)

考虑一下:当你说

student3 = Students.create_with_species("human")

这个新的学生对象应该得到什么sexage?您尚未指定任何。