如何使`SomeClass.new`返回计算值而不是创建对象

时间:2012-11-19 13:17:21

标签: ruby

对于Ruby的initialize方法有点困惑。

为什么不像其他方法那样返回我的价值?

class SomeClass

  attr_reader :val

  def initialize a, b, c
    @val = a + b + c
    @val
  end

end

val = SomeClass.new 1, 2, 3

我需要val成为6未初始化的对象。

当然我可以使用val.val,但这是另一个故事。

2 个答案:

答案 0 :(得分:2)

您需要覆盖self.new方法:

class SomeClass
  def self.new(*)
    instance = super
    instance.val
  end

  attr_reader :val

  def initialize a, b, c
    @val = a + b + c
    @val
  end

end

p SomeClass.new 1, 2, 3
#=> 6

当你创建一个类的实例时,你实际上正在调用该类的self.new,然后调用initialize方法并返回初始化的实例。

请参阅live demo here

答案 1 :(得分:1)

initialize就像任何其他方法一样。 当然,它返回返回值,就像任何其他方法一样。

是什么让你觉得它没有?您永远不会在您提供的代码示例中调用initialize,因此您如何知道它返回的值是什么?

class SomeClass
  attr_reader :val

  def initialize a, b, c
    @val = a + b + c
    @val
  end

end

obj = SomeClass.allocate
val = obj.send :initialize, 1, 2, 3
# => 6