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

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

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

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

 methods.grep /^\w+=$/ 

并且正则表达式可以缩短为

 methods.grep /\w=$/ 

但不太清楚。

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

例如,如果我有一个人,并且该类在其中有方法height_feet=height_meters= ,我将无法判断该人的身高的实现是基于@height_feet还是@height_meters ,甚至是@height_cubits

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

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

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