你能告诉我为什么这不起作用吗?
以下代码输出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")
答案 0 :(得分:1)
就语法而言,您必须使用@sex
和@age
而不是sex
和age
。否则,它们不会被解释为实例属性。
但你确实意识到代码的逻辑被破坏了吗?我知道你想使用静态工厂方法模式,但这不是你应该怎么做的,因为当你调用那个方法时@sex
和@age
是nil,而那些变量是实例属性而不是类属性。
答案 1 :(得分:1)
sex
和age
未定义。你的意思是使用类变量吗?使用@age
或@sex
将导致nils,因为没有设置类属性并且尚未创建实例,因此也没有设置实例变量。您无需在Students.new
中说明create_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"
)
答案 2 :(得分:1)
@sex
和@age
是实例属性。你不能在类方法中使用它们(它们意味着什么?)。您只在sex
内写了age
和create_with_species
,但是又一次:这些应该引用什么? (在实例方法中,他们将调用访问器,但此时没有实例调用访问器。)
考虑一下:当你说
时student3 = Students.create_with_species("human")
这个新的学生对象应该得到什么sex
和age
?您尚未指定任何。