2016-10-07 102 views
2

有人可以比我更精通紅寶石,請回答爲什麼以下內容不會返回任何內容?初始化方法的返回值

class ThreeAndFive 
    def initialize(low_number, high_number) 
    @total = 0 
    (low_number..high_number).each do |number| 
     if (number % 3 == 0 && number % 5 == 0) 
     @total += number 
     end 
    end 
    #puts @total here returns value of 33165 
    return @total 
    end 
end 

test = ThreeAndFive.new(1,1000) 
#This returns nothing but "#<ThreeAndFive:0x25d71f8>" 
puts test 

不應該把put測試的結果和我直接調用@total直接放在類中一樣嗎?

+0

我不知道Ruby,但它在我看來好像是在實例化一個對象並將其分配給'test',而不是調用一個函數並將返回值指定給'test'。 –

回答

4

它正常工作:

test = ThreeAndFive.new(1,1000) 
#=> #<ThreeAndFive:0x007ff54c5ff610 @total=33165> 

含義,您在initialize定義實例變量@total,你必須在那裏。

應該或不應該 「把測試」 返回33165

NO。如果你想有@total要顯示,您將定義一個attr_reader :total ,並用它如下:

test.total 
#=> 33165 

另一種選擇(如果你因爲某些原因不想定義讀者):

test.instance_variable_get :@total 
#=> 33165 
+0

它無法正常工作。正如我在問題中所述,ruby僅返回#返回值無處可尋。 – TheRealMrCrowley

+0

@TheRealMrCrowley我在控制檯中測試它,它確實返回期望值(顯示在我的答案中)。 –

+0

這個問題在我看來很清楚,應該或者不應該「把測試」還給33165.如果答案是否定的,那麼你的編輯解釋部分 – TheRealMrCrowley

5

這就是大概發生在你打電話new

def new 
    allocate object 
    call initialize method on object 
    return object 
end 

這就是爲什麼你canno t返回@total,而不是獲取對象本身。

+1

爲什麼「粗略」?爲什麼不準確地*拼寫*會發生什麼? 'def initialize(* args,&block)object = allocate; object.send(:initialize,* args,&block);返回對象;結束' –

+0

@JörgWMittag你的例子拋出一個異常'未定義的局部變量或方法'allocate'',這可能是因爲你在類的實例上下文中調用'allocate',而不是class本身。你偶然意味着定義'self.new'?最有可能的是我不明白的東西,因爲你錯了的可能性不大。 –

+0

@AndreyDeineko:我不確定你的意思。 ['new'](http://ruby-doc.org/core/Class.html#method-i-new)是['Class']的實例方法(http://ruby-doc.org/core /Class.html)和['allocate'](http://ruby-doc.org/core/Class.html#method-i-allocate)也是'Class'的一個實例方法。當然,你可以在實例方法中調用同一類的其他實例方法? –

3

初始化從Class#new調用,它返回新對象,而不是(忽略)返回值#initialize