Стандартный метод доступа Ruby? - PullRequest
4 голосов
/ 11 марта 2009

Есть ли метод по умолчанию или метод доступа к классу, который я могу добавить к классу Ruby, который вызывается, если метод доступа (свойство типа Ruby) не завершается? Затем я могу написать некоторый пользовательский код для ответа, например, из списка массивов, прочитанного из базы данных, где к значению можно обращаться как к аксессору, а я не пишу код аксессора (поскольку при чтении из базы данных он неизвестен).

Использование Ruby MRI 1.9

Спасибо!

1 Ответ

10 голосов
/ 11 марта 2009

Да, это называется method_missing; он вызывается всякий раз, когда используется неопределенный метод. Вы можете использовать его для добавления или эмуляции любого метода, который вам нужен, включая методы доступа.

Например, если вы выбрасываете это на Hash, вы можете рассматривать содержимое хэша как свойства:

h = {}
def h.method_missing(*args)
    if args.length == 1
        self[args[0]]
      elsif args.length == 2 and args[0].to_s =~ /^(.*)=$/
        self[$1.intern] = args[1]
      else
        super
      end
    end

давайте напишем:

h.bob = "Robert"

и

if h.bill == "William" ...

и т. Д. В дополнение к более обычному стилю h[:bob] = ....

...