2013-01-08 125 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