2013-01-08 227 views
1

我确信我已经有过这个工作!从Ruby类返回对象

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

坚果壳:'@ title'是一个类实例变量,'string2'是一个实例方法;两者不同。 –

回答

1

下面的代码:

"Matsumoto, Yukihiro" 
"Director" 

我:

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运行我们假设你想让你创建的所有对象的标题保持一致。如果不是,那么iamnotmaynard的答案就是你要的。

+0

感谢马特 - 实际上,在我的工作代码中,标题是动态的,并且是从请求返回到Web服务的数据。但是,这很好。奇怪的是我确信我以前做过这个,而不必使用double @@变量! – user1513388

1

您没有将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" 
+0

类也是对象 - 它们可以有实例变量(它与该类的任何实例的实例变量完全不同) –

+0

@FrederickCheung我在类上使用了类变量而不是实例变量,但当然也存在这些变量,因为一切都是一个对象。 – iamnotmaynard

2

在你的类的背景下,@title指类实例变量。在实例方法的上下文中,@title引用一个实例变量。你混淆了这两个。

你需要什么,而不是是一个懒惰的初始化,如果你有某种默认,你需要应用:

def title 
    @title ||= "Director" 
end 

或者更好的,来填充它摆在首位。解决这个问题的方法之一是增加自己的初始化方法:

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