有没有更好的方法来获取Ruby对象的公共“属性”?

时间:2010-12-16 23:58:00

标签: ruby reflection metaprogramming

有没有更好的方法来获取Ruby对象的公共“属性”?

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

3 个答案:

答案 0 :(得分:3)

您的正则表达式不完整:它匹配以任何字符开头的方法,而不仅仅是单词字符。获得所有“作家”的最佳方式是

methods.grep /^\w+=$/

正则表达式可以缩短为

methods.grep /\w=$/

但不太清楚。

答案 1 :(得分:2)

在ruby中,除非你进行元编程以破坏封装,否则更改另一个对象的实例变量的唯一方法是调用恰好这样做的方法。如果不使用元编程,就无法确定方法正在改变哪个实例变量。

例如,如果我有一个人,并且该课程中有方法height_feet=height_meters=,我将无法判断该人的身高是否基于@height_feet@height_meters甚至@height_cubits

这是一件好事,因为这意味着你完全按照界面编程,而不是实现。

答案 2 :(得分:1)

嗯,Ruby中没有“属性”这样的东西。基本上,既然你已经提出了这个词(或者更准确地说:你在定义它时适用于Ruby),你可以定义它的含义,但另一方面它也意味着你必须自己实现它的语义。 / p>

所以,如果你将“property”定义为“以等号结尾但不仅仅由等号组成的方法”,那么,是的,你的定义是最好的方法。 (顺便说一句:您对“财产”的定义包括<=>=!=等方法,这些方法可能是您想要的,也可能不是。“