gpt4 book ai didi

ruby - &.method 语法(安全导航运算符)在 Ruby 中如何工作?

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

我注意到如果你输入:object &,你得到了对象。例如:

1.class   # => Integer
1 &.class # => Integer
'hello'.then { |x| x.equal?(x &.itself) } # => true
[1, 2, 3] &.map(&:next) # => [2, 3, 4]

我找不到object &.method 语法的文档这种语法是如何工作的?

最佳答案

这里有 2 个独立的运算符:

  1. 安全导航运算符 &. - 这是在 Ruby 2.3.0 中引入的安全导航运算符。如果被调用者是 nil,它基本上返回 nil,而不是引发异常 undefined method called for Nil class。例如:

    a = 1
    a.next
    # => 2
    a&.next
    # => 2
    a = nil
    a.next
    # => NoMethodError (undefined method `next' for nil:NilClass)
    a&.next
    # => nil ## No exception, returns nil

    您可以阅读更多 heredocumentation

  2. 一元 & :这个运算符有点复杂。它几乎等同于调用 #to_proc 但不完全是这样。但是对于这次讨论,让我们这样想。所以,如果你有一个 Proc,在它前面调用 & 将调用 Proc 上的 #to_proc 并将其转换为一个 block

    multiply_by_2 = Proc.new { |x| x * 2 }
    # => #<Proc:0x00007fb4771cf560>
    # &multiply_by_2 almost equivalent to { |x| x * 2 } but is not correct syntax
    [1, 2].map(&multiply_by_2)
    # => [2, 4]
    # equivalent to [1, 2].map { |x| x * 2 }

    但是如果我们给 & 运算符而不是 proc 一个像 :abc 这样的符号会发生什么。它会尝试在符号上调用 #to_proc 并且 ruby​​ 已经定义了 Symbol#to_proc ,它大致翻译成这样:

    def to_proc
    # this will return some block like { |x| x.send(:abc) }
    lambda { |x| x.send(self) }
    end

    所以 &:abc 大致翻译成这个 block { |x| x.abc 使用下面的转换

    &:abc =====> :abc.to_proc =====> { |x| x.send(:abc) } ====> { |x| x.abc }

    因此,与其执行 [1, 2, 3].map { |x| x.next ,你可以做 [1, 2, 3].map(&:next) 因为 &:next 大致等同于 block { |x| x.next .

    参见 unary & (这是我在这里所写内容的主要来源)以供更多阅读。

关于ruby - &.method 语法(安全导航运算符)在 Ruby 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57812498/

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