Есть два способа этот вопрос можно прочитать:
- Технически, почему работа индексирования решения, но не
first
один?
Причина заключается в том, что для того, чтобы иметь возможность использовать foo.bar = :baz
, класс foo
«s должен реализовать метод bar=
.
class X
def initialize(y)
@y = y
end
def y
@y
end
end
x = X.new(3)
x.y # => 3
x.y = 7 # => NoMethodError: undefined method `y=' for #<X:0x007fb272726d80 @y=3>
class X
def initialize(y)
@y = y
end
def y
@y
end
def y=(new_y)
@y = new_y
end
end
x = X.new(3)
x.y # => 3
x.y = 7
x.y # => 7
Ядро библиотеки делает реализацию Array#[]=
, но не Array#first=
.
- В чем причина, по которой они решили не реализовывать
Array#first=
?
first
метод фактически является частью Enumberable
и если один класс реализован first=
, это выглядело бы противоречивым, если не было реализации Enumerable#first=
.
И этого не может быть, потому что для некоторых перечислений такой метод не имеет смысла (Enumerator
). Это также потребует от вас большего количества перечислимых функций. На данный момент для того, чтобы класс стал перечислимым, ему просто нужно реализовать метод each
и включить модуль Enumerable
.
Потому что существует ['Array # [] ='] (http://ruby-doc.org/core-2.2.0/Array.html#method-i-5B-5D-3D), но есть no 'Array # first ='. Вы спрашиваете, почему они их не поместили? – ndn
@ndn да, точно. – Aparichith
Как было сказано несколькими читателями, существует метод экземпляра [Array # [\] =] (http://ruby-doc.org/core-2.2.0/Array.html#method-i-5B-5D-3D), но не метод экземпляра 'Array # first ='. Это так просто. Требуется ли 'Array # first ='? Нет, потому что можно использовать '[] ='. Требуется ли 'Array # first' (что нам нужно)? Нет, потому что можно использовать [Array # [\]] (http://ruby-doc.org/core-2.2.0/Array.html#method-i-5B-5D) (что, кстати, так же отличается из 'Array [] =' как ночь с дня). Итак, почему мы имеем 'Array # first', но не' Array # first = '? Потому что те, кто выступал за добавление последнего, несли день. –