我确信我以前有这个工作!
我有以下课程。标题字符串是在类中创建的,fname和lname字符串作为参数传入。但是,我似乎无法让@title对象返回除nil之外的任何内容。
我在这里做错了什么?
class Person
attr_accessor :fname, :lname, :title
def initialize(fname, lname)
@fname = fname
@lname = lname
@title = title
end
def string1
@lname + ", " + @fname
end
@title = "Director"
def string2
@title
end
end
p = Person.new("Yukihiro", "Matsumoto")
p p.string1
p p.string2
答案 0 :(得分:2)
在类的上下文中,@title
引用类实例变量。在实例方法的上下文中,@title
引用实例变量。你会混淆这两个。
如果你需要应用某种默认值,那么你需要的是一个惰性初始化器:
def title
@title ||= "Director"
end
或者更好的是,首先填充它。解决此问题的一种方法是增加初始化方法:
def initialize(fname, lname, title = nil)
@fname = fname
@lname = lname
@title = title || "Director"
end
答案 1 :(得分:1)
您没有将title
传递给构造函数。你需要有一些基本的东西
def initialize(fname, lname, title)
@fname = fname
@lname = lname
@title = title
end
并用
调用它p = Person.new("Yukihiro", "Matsumoto", "sensei")
行@title = "Director"
在类定义期间执行,它在类Person
本身上设置变量,而不是在构造类的实例期间,这就是实例变量{ {1}}未在使用@title
创建的新对象中设置为“Director”。
事实上,这是如何证明这就是正在发生的事情。添加此方法
Person.new
为class Person
def self.string3
@title
end
end
添加一个类方法,以获取在类定义期间设置的类的实例变量:
Person
答案 2 :(得分:1)
以下代码:
class Person
attr_accessor :fname, :lname
def initialize(fname, lname)
@fname = fname
@lname = lname
end
def string1
@lname + ", " + @fname
end
def title
@@title
end
@@title = "Director"
def string2
@@title
end
end
p = Person.new("Yukihiro", "Matsumoto")
p p.string1
p p.string2
使用Ruby 1.9.3运行时,给出以下输出:
"Matsumoto, Yukihiro"
"Director"
我假设您希望为您创建的所有对象保持标题相同。如果没有,那么iamnotmaynard的答案就是你所追求的。