2016-10-07 100 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