gpt4 book ai didi

ruby - 与安全导航运算符(&. 或 "ampersand-dot")等价的 pre-Ruby2.3 是什么?

转载 作者:数据小太阳 更新时间:2023-10-29 08:07:32 26 4
gpt4 key购买 nike

我能找到的关于 Ruby 的新安全导航运算符 (&.) 的每个问题的答案(Q1Q2)都错误地声明了 obj&.foo等同于 obj && obj.foo

很容易证明这个等价是不正确的:

obj = false
obj && obj.foo # => false
obj&.foo # => NoMethodError: undefined method `foo' for false:FalseClass

此外,还有多重评价的问题。将 obj 替换为具有副作用的表达式表明副作用仅在 && 表达式中加倍:

def inc() @x += 1 end

@x = 0
inc && inc.itself # => 2

@x = 0
inc&.itself # => 1

避免这些问题的 obj&.foo 最简洁的 pre-2.3 等价物是什么?

最佳答案

Ruby 2.3 中的安全导航运算符与 try! 几乎完全相同。 ActiveSupport 添加的方法,减去其 block 处理。

它的简化版本可能如下所示:

class Object
def try(method, *args, &block)
return nil if self.nil?
public_send(method, *args, &block)
end
end

你可以这样使用

obj.try(:foo).try(:each){|i| puts i}

这个try方法实现了安全导航运算符的各种细节,包括:

  • 如果接收者是nil,它总是返回nil,不管nil是否实际实现了查询的方法。
  • 如果非nil 接收器不支持该方法,它会引发一个NoMethodError
  • 它不会吞噬方法调用的任何异常。

由于语言语义的差异,它不能(完全)实现真正的安全导航算子的其他特性,包括:

  • 我们的 try 方法总是计算额外的参数,这与安全导航运算符相反。考虑这个例子

    nil&.foo(bar())

    这里,bar() 没有计算。当使用我们的 try 方法时

    nil.try(:foo, bar())

    我们总是先调用 bar 方法,不管我们之后是否用它调用 foo

  • obj&.attr += 1 是 Ruby 2.3.0 中的有效语法,在以前的语言版本中不能仅通过单个方法调用来模拟。

请注意,在生产环境中实际实现此代码时,您应该查看 Refinements而不是修补核心类。

关于ruby - 与安全导航运算符(&. 或 "ampersand-dot")等价的 pre-Ruby2.3 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34602054/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com