从Ruby Classes返回对象

时间:2013-01-08 16:44:09

标签: ruby class

我确信我以前有这个工作!

我有以下课程。标题字符串是在类中创建的,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

3 个答案:

答案 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的答案就是你所追求的。