【问题标题】:Return value of initialize method [duplicate]初始化方法的返回值
【发布时间】:2017-02-16 22:37:16
【问题描述】:

能否请比我更精通 ruby​​ 的人回答为什么以下内容没有返回任何内容?

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

puts 测试的结果不应该和我在课堂上直接在 @total 上调用 puts 的结果一样吗?

【问题讨论】:

  • 我不了解 Ruby,但在我看来,您好像是在实例化一个对象并将其分配给 test,而不是调用函数并将返回分配给 test

标签: ruby class return-value


【解决方案1】:

这就是你打电话给new时大致发生的情况

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

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

【讨论】:

  • 为什么是“大致”?为什么不说明确切会发生什么? def initialize(*args, &amp;block) object = allocate; object.send(:initialize, *args, &amp;block); return object; end
  • @JörgWMittag 您的示例抛出异常undefined local variable or method 'allocate' 可能是因为您在类实例的上下文中调用allocate,而不是类本身。您是否偶然定义了self.new?很可能只是有些东西我不明白,因为你不太可能弄错。
  • @AndreyDeineko:我不确定你的意思。 newClass 的实例方法,allocate 也是Class 的实例方法。当然,你可以在一个实例方法中调用同一个类的其他实例方法吗?
  • @JörgWMittag 你写的是def initialize,而你的意思是def new(假设定义是在隐含的class Class 上下文中)。或者,def self.new 在某个特定类的上下文中。
  • @philomory:哦,伙计。睡眠不足导致大脑混乱!谢谢。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    它工作正常:

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

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

    应该或不应该“测试”返回 33165

    否。如果你想显示@total,你可以定义一个attr_reader :total 并按如下方式使用:

    test.total
    #=> 33165
    

    另一个选项(如果由于某种原因您不想定义 reader):

    test.instance_variable_get :@total
    #=> 33165
    

    【讨论】:

    • 它无法正常工作。正如我在问题中所说,ruby 只返回 #<0x25d71f8>
    猜你喜欢
    • 2014-02-02
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    相关资源
    最近更新 更多