0

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

下面的代码正确输出 student1 和 student2,但我无法让类方法在 student3 上工作。

我要做的就是分配一个类方法.create_with_species,其中物种属性=“人类”。

但是,当我运行程序时,我收到“局部变量或方法sex未定义”的错误。我是新手,我无法弄清楚我做错了什么!

我的理解是,由于我在 Initialize 方法中确定了“性别”,我应该能够在类方法中使用它,例如create_with_species. 我尝试在类方法中明确定义性别, as 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

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

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

于 2012-04-28T21:48:33.940 回答
1

sex并且age没有定义。你的意思是使用类变量吗?使用@ageor@sex将导致 nils,因为没有设置类属性并且尚未创建实例,因此也没有设置实例变量。您无需Students.newcreate_with_species. new就足够了,因为您的范围是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"
)
于 2012-04-28T21:53:01.847 回答
1

@sex并且@age是实例属性。您不能在类方法中使用它们(它们是什么意思?)。你已经写了 just sexand ageinside create_with_species,但又一次:这些应该指的是什么?(在实例方法中,它们将被调用访问器,但此时没有实例可以调用访问器。)

考虑:当你说

student3 = Students.create_with_species("human")

sex这个新的age学生对象应该得到什么?你没有指定任何。

于 2012-04-28T21:55:23.797 回答