Подтвердить что ты не робот

Что означают `def + @` и `def - @`?

В этой реализации Haskell-подобных реализаций в Ruby есть код, который я никогда не видел в Ruby:

class Array
  def [email protected]
    # implementation
  end

  def [email protected]
    # implementation
  end
end

Что означают def [email protected] и def [email protected]? Где найти (полу) официальную информацию о них?

4b9b3361

Ответ 1

Это унарные методы + и -. Они вызывается, когда вы пишете -object или +object. Синтаксис +x, например, заменяется на [email protected].

Рассмотрим это:

class Foo
  def +(other_foo)
    puts 'binary +'
  end

  def [email protected]
    puts 'unary +'
  end
end

f = Foo.new
g = Foo.new

+ f   
# unary +

f + g 
# binary +

f + (+ g) 
# unary +
# binary +

Еще один надуманный пример:

class Array
  def [email protected]
    map(&:[email protected])
  end
end

- [1, 2, -3]
# => [-1, -2, 3]

Они упоминаются здесь и там есть статья о том, как определить их здесь.