1

我确信我以前做过这个工作!

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

3 回答 3

2

在您的类的上下文中,@title指的是类实例变量。在实例方法的上下文中,@title指的是实例变量。你把这两个弄混了。

如果您需要应用某种默认值,那么您需要的是一个惰性初始化器:

def title
  @title ||= "Director"
end

或者更好的是,首先填充它。解决此问题的一种方法是增加您的初始化方法:

def initialize(fname, lname, title = nil)
  @fname = fname
  @lname = lname
  @title = title || "Director"
end
于 2013-01-08T16:50:16.770 回答
1

您没有传递title给构造函数。你需要有一些类似的东西

def initialize(fname, lname, title)
    @fname = fname
    @lname = lname
    @title = title
end

并调用它

p = Person.new("Yukihiro", "Matsumoto", "sensei")

该行在@title = "Director"类定义期间执行,它在类Person本身上设置变量,而不是在构造类的实例期间执行,这就是为什么在@title您创建的新对象中没有将实例变量设置为“Director”的原因与Person.new.

事实上,这里是如何表明这是正在发生的事情。添加此方法

class Person
    def self.string3
        @title
    end
end

添加一个类方法来Person获取在类定义期间设置的类的实例变量:

>> p Person.string3
"Director"
于 2013-01-08T16:47:41.753 回答
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的答案就是您所追求的。

于 2013-01-08T16:51:04.757 回答