(так как это немного долго для комментария ...)
Действительно, вы не можете изменить значение self
, но вы можете изменить свойства на self
, что и являетсяпроисходит в вашем примере.
Позвольте мне уточнить.Скажем, у вас есть класс Foo
и вы делаете что-то вроде этого:
f = Foo.new
f.bar = 3
puts f.bar # => 9
"2
" ??На самом деле происходит то, что вы вызываете метод bar=
для f
с аргументом 1
.Метод bar=
может выглядеть примерно так:
class Foo
def bar=(val)
@bar = val**2 # square the given value and assign it to the instance
end # variable @bar
def bar
@bar # return the instance variable @bar -- a shortcut for this is
end
# we could get rid of the second method, though, but using attr_reader:
attr_reader :bar
end
Хорошо, а что по этому поводу?
f = Foo.new
puts f[5] # => 10
"10
" ?!Ага.Опять же, []
- это просто синтаксический сахар для простого старого метода.Примерно так:
class Foo
def [](val)
val * 2 # Ruby just takes the value you put between [] and gives it to you as
end # the first parameter
end
И наконец:
f = Foo.new
f[:bar] = 99
puts f[:bar] # => 100
Да, вы уже догадались, это просто еще один вызов метода.Например:
class Foo
@my_hash = {}
def []=(key, val) # Ruby gives us the value between the [] as the first
@my_hash[key] = val + 1 # parameter and the value after the = as the second,
end # and we use them to set a value on an internal
# instance variable...
def [](key)
@my_hash[key] # ...and we can use the "getter" to get a value from
end # the instance variable.
end
Вы правы, этот материал не все освещен в одном удобном источнике, поэтому я надеюсь, что это поможет.Не стесняйтесь комментировать, если вам нужны дальнейшие объяснения.