Ruby - понимающие символы - PullRequest
4 голосов
/ 09 июня 2011

У меня небольшие проблемы с пониманием того, как символы работают в моем коде.Я понимаю, что это по сути неизменяемые строки, но я не до конца понимаю, как символы автоматически «распознают» другие части моего кода.

Например, в приведенной ниже программе я передаю два объекта метода в свой math_machineметоды, но для этого я использую символ, представляющий их имя.Откуда Ruby узнает, что я имею в виду эти методы?

def plus x,y
    return x+y
end

def minus x,y
    return x-y
end

def math_machine(code,x,y)
    code.call(x,y)
end

puts math_machine(method(:plus),5,5)
puts math_machine(method(:minus),5,5)

Еще один пример символов, которые я не понимаю, касается инкапсуляции - как attr_reader, attr_writer и attr_accessor знаютчто следующий символ относится к переменной экземпляра в моей программе?

Если бы кто-то мог объяснить мне таинственную природу символов в Ruby (что происходит за кулисами), это было бы потрясающе!

1 Ответ

1 голос
/ 09 июня 2011

Например, в приведенной ниже программе я передаю два объекта метода в мои методы math_machine, но для этого я использую символ, представляющий их имя.Откуда Ruby узнает, что я имею в виду эти методы?

Это не имеет ничего общего с символами.Вы можете даже сделать method('plus'), и вы получите тот же результат, что и метод (: плюс).

irb(main):001:0> def plus
irb(main):002:1> end
=> nil
irb(main):003:0> method(:plus)
=> #<Method: Object#plus>
irb(main):004:0> method('plus')
=> #<Method: Object#plus>
irb(main):005:0> method('plus') == method(:plus)
=> true

Другой пример символов, которые я не понимаю, касается инкапсуляции - как это сделатьattr_reader, attr_writer и attr_accessor знают, что следующий символ относится к переменной экземпляра в моей программе?

Эти методы предназначены для предоставления читателям, авторам и методам доступа (r + w) метода экземпляра,Они просто принимают значение переданного символа и создают соответствующие методы.

...