ruby - 对对象的误解#tap

标签 ruby

这是我的简单测试代码:

def test_function
  0.tap do |v|
    v += 10
  end
end

p test_function

为什么我在这里得到 0?我在等着得到 10。

更新:

class TestClass
    def initialize
        @v = 0
    end

    def inc 
        @v = @v + 1
    end
end

def test_function
    0.tap do |v|
        v += 10
    end
end

def test_function_2
    TestClass.new.tap { |obj|
        obj.inc
    }
end

p test_function
p test_function_2

0

TestClass:0x29244f0 @v=1

最佳答案

原因是原来的对象没有被+=操作符改变。那么如果您在 block 中创建对它的引用,将引用更改为指向另一个对象,该对象大 10,然后返回,会发生什么。 0 的值保持不变。

关于它 - 这就是您想要发生的事情。 += 运算符不会更改它所操作的对象。它返回另一个不同的 对象并将引用分配给它。这就像:

  v = 0
  v = v + 10

您不会期望 0 == 10 在此之后为真,对吧?

关于ruby - 对对象的误解#tap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15631166/

相关文章:

ruby - 通过 ruby​​ 中的键和值数组进行简单哈希合并(以 perl 为例)

mysql - 搜索引擎过滤器::每个过滤器的预计数结果

ruby-on-rails - Rails + Devise 嵌套注册表未定义方法 'build_address'

ruby - 获取 Ruby 文档的最快方法是什么?

ruby - 将大型数组传递给类时性能会降低吗?

Ruby:类实例化的快捷方式

ruby - 使用可枚举的内置 Ruby 访问和操作嵌套数据

ruby - 是否有将图像文件转换为 ASCII 艺术的命令行程序或库?

ruby-on-rails - Google Apps 和 Rails 中的 Open ID 身份验证 - 安全性

ruby - 为什么不能在 Symbols 或 Fixnums 上定义单例方法?