【问题标题】:Returning objects from Ruby Classes从 Ruby 类返回对象
【发布时间】:2013-01-09 01:09:20
【问题描述】:

我确信我以前有过这样的工作!

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

【问题讨论】:

  • 简而言之:@title是类实例变量,string2是实例方法;两者是不同的。

标签: ruby class


【解决方案1】:

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

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

def title
  @title ||= "Director"
end

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

def initialize(fname, lname, title = nil)
  @fname = fname
  @lname = lname
  @title = title || "Director"
end

【讨论】:

    【解决方案2】:

    以下代码:

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

    【讨论】:

    • 感谢 Matt - 实际上在我的工作代码中,标题是动态的,是从请求返回到 Web 服务的数据。但是,这效果很好。奇怪的是,我确信我之前已经这样做了,而不必使用双 @@ 变量!
    【解决方案3】:

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

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

    并调用它

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

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

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

    class Person
        def self.string3
            @title
        end
    end
    

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

    >> p Person.string3
    "Director"
    

    【讨论】:

    • 类也是对象——它们可以有实例变量(与该类的任何实例的实例变量完全不同)
    • @FrederickCheung 我在类中使用了类变量,但没有使用实例变量,但当然这些也存在,因为一切都是对象。
    猜你喜欢
    • 2016-11-18
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2022-07-27
    • 1970-01-01
    • 2011-04-05
    相关资源
    最近更新 更多