Есть ли лучший способ получить общедоступные "свойства" объекта Ruby? - PullRequest
3 голосов
/ 17 декабря 2010

Есть ли лучший способ получить общедоступные "свойства" объекта Ruby?

def props
  self.public_methods.grep(/.=$/) - ["==","==="]
end

Ответы [ 3 ]

3 голосов
/ 15 марта 2011

Ваше регулярное выражение является неполным: оно соответствует методам, которые начинаются с любого символа, а не просто слова. Лучший способ получить всех "писателей" был бы

methods.grep /^\w+=$/

И регулярное выражение может быть сокращено до

methods.grep /\w=$/

но менее ясно.

2 голосов
/ 17 декабря 2010

В ruby, если вы не выполняете метапрограммирование, чтобы нарушить инкапсуляцию, единственный способ изменить переменную экземпляра другого объекта - это вызвать метод, который может это сделать.И без использования метапрограммирования невозможно определить, какая переменная экземпляра изменяется методом.

Например, если у меня есть человек, и в этом классе есть методы height_feet= и height_meters=, яне смог бы сказать, была ли реализация этого роста человека основана на @height_feet или @height_meters или даже @height_cubits.

Это хорошая вещь, так как это означает, что вы программируете чисто дляинтерфейс, а не реализация.

1 голос
/ 17 декабря 2010

Ну, в Ruby нет такой вещи, как "свойство". И в основном, поскольку вы составили слово (или, точнее, вы составили его определение в применении к Ruby), вы можете определить, что оно означает, но с другой стороны, это также означает, что вы должны реализовать его семантику самостоятельно.

Итак, если вы определяете «свойство» как «метод, который заканчивается знаком равенства, но не состоит исключительно из знаков равенства», то да, ваше определение - наилучший из возможных. (Кстати: ваше определение «свойства» включает в себя такие методы, как <=, >= и !=, которые могут или не могут быть тем, что вы хотите.)

...