2013-02-26 46 views
2

,看看誰是打在nested methodsself的作用,我想下面的代碼:`self`在嵌套方法中如何在ruby中工作?

def test 
    p "#{self}" 
    def show 
    p "#{self}" 
    end 
end 
# => nil 

作爲一個效果,我得到了以下兩個對象:

Object.new.test 
"#<Object:0x00000002212d78>" 
# => nil 
Object.new.test.show 
"#<Object:0x00000002205330>" #<~~~ this is self understood 
"" #<~~~ how this one came? 
# => "" 

但是從編碼的數字,我無法理解這些對象屬於哪個類。我試了下面的代碼,並得到了各自的class名稱。

Object.new.test.class 
"#<Object:0x000000021ff3b8>" 
# => NilClass 
Object.new.test.show.class 
"#<Object:0x000000020660b0>" 
"" 
# => String 

因此,誰能幫助我瞭解上面的代碼如何產生這些class名字的概念?

編輯

在這裏,我試着問我的問題更具體的方式:

def test 
p "First level # => #{self}" 
def show 
p "Second level # => #{self}" 
end 
end 
# => nil 
Object.new.test.show 
"First level # => #<Object:0x000000014a77b0>" 
"Second level # => " 
# => "Second level # => " 
Object.new.test.show.class 
"First level # => #<Object:0x0000000130ef70>" 
"Second level # => " 
# => String 

爲什麼p "Second level # => #{self}"聲明self""價值?

回答

3

Object.new.test.show調用Object.new.test對象中的show方法。

Object.new.test返回nil(因爲p返回nil),但同時它將show方法的定義添加到Object類。

由於nil屬於NilClass類,它是Object的子類,所以nil現在顯示爲一個方法,因此實際上可以在nil中調用show。

當你做Object.new.test。秀相當於然後做

nil.show 

時,節目中,你做P「#{}自我」,實際上是在打印nil.to_s

nil.to_s is "" 

這解釋了那個神祕的「」你看。

+0

'+ 1'給你,爲你'nil.show'解釋。 – 2013-02-26 20:46:22

1

這是相當簡單:

def show 
    p "#{self}" 
end 

nil回報,即def一部分,這就是爲什麼test方法返回一個nil目的,NilClass的一個實例。在show方法中,您在做p "#{self}",它將返回一個字符串對象,該對象是String類的一個實例。

+0

可以向下選民爲什麼向下票詳細點嗎? – Candide 2013-02-26 18:11:26

+0

我以爲OP想知道爲什麼對象id不同,我錯了,所以我刪除了投票並添加了贊成票;)乾杯。 – Intrepidd 2013-02-26 18:15:16

+0

仍然不清楚我的邏輯:( – 2013-02-26 18:21:12

0

嘗試使用:self.class.to_s。 SO要我輸入多餘的字符,所以[:

1

試試這個:

class FooBar 
    def foo 
    puts self.class 
    puts self 
    def bar 
     puts self.class 
     puts self 
    end 
    bar 
    end 
end 


FooBar.new.foo 

我:

FooBar 
#<FooBar:0x007fc413849818> 
FooBar 
#<FooBar:0x007fc413849818> 

你會得到不同的結果,因爲您分配不同的對象。

self返回定義方法的對象,即使它是嵌套方法。

+0

我知道'自我',但只是對知道好奇使它成爲'NilClass'對象,爲什麼'String'類?你能告訴我用我的代碼示例嗎? – 2013-02-26 18:11:27

+0

這是因爲p返回一個字符串,並且新函數的定義返回nil,請參閱@Candide答案。 – Intrepidd 2013-02-26 18:12:51

0

我們都知道 - self inside a method is always the object on which the method was called。所以我們試着檢查一下這件事的真實性。

讓我們看看誰是默認self從下面的代碼首先:

m=self 
# => main 
m.class 
# => Object 

好吧,默認selfObject類的對象。

剛剛以更簡化的方式編寫了下面的代碼,從描述的代碼中突出顯示了這個概念。

def test 
p self.class 
def show 
p self.class 
end 
end 
# => nil 

記住self inside a method is always the object on which the method was called只保留test如下調用。

test 
Object 
# => nil 

是的,Object已經返回,在其上test被調用,這意味着上述聲明是真實的。

test.show 
Object 
NilClass 
# => NilClass 

調用到test也返回nil由於塊def show;p self.class;end。現在nilNilClass一個對象。因此show方法已被調用NilClass對象。結果selfNilClass。上述聲明再次成立。

通過上述概念試圖用微小的步驟,以達到實際的目標:

def test 
p "1. # => #{self}" 
def show 
p "2. # => #{self}" 
end 
end 
# => nil 

test 
"1. # => main" #<~~ main is an object of class Object,on which test was called from IRB. 
# => nil 

test.show 
"1. # => main" 
"2. # => " #<~~ nil("" means nil.to_s) is an object of Nilclass,on which show was called from IRB. 
# => "2. # => " 
相關問題