有人能比我更精通红宝石,请回答为什么以下什么都不返回?
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 :(得分: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
的(忽略)返回值。