initialize方法的返回值

时间:2016-10-07 20:44:54

标签: ruby class return-value

有人能比我更精通红宝石,请回答为什么以下什么都不返回?

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一样吗?

3 个答案:

答案 0 :(得分:7)

这是您致电new

时大致发生的事情
def new
  allocate object
  call initialize method on object
  return object
end

这就是为什么你不能返回@total而是获取对象本身的原因。

答案 1 :(得分:3)

它正常工作:

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

意思是,您在@total中定义了实例变量initialize并且在那里有了它。

  

应该或不应该&#34;放测试&#34;返回33165

否。如果您希望显示@total,则需要定义attr_reader :total 并使用如下:

test.total
#=> 33165

另一种选择(如果由于某种原因你不想定义读者):

test.instance_variable_get :@total
#=> 33165

答案 2 :(得分:3)

Class#new调用初始化,它返回新对象,而不是#initialize的(忽略)返回值。