如何确定对象是否为PORO?

时间:2016-08-24 16:58:31

标签: ruby oop

当我查看对象(在终端或rails控制台中)时,如何确定它是否为PORO?

我理解这意味着一个对象只是Ruby(不依赖于Rails)。但实际上我并不了解。

例如,当我将puts @a_form.inspect打印到控制台时,它是PORO吗?

#<AForm:0x007fdbf9b33468 @a=#<A id: 1,...

我已经完成了很多谷歌搜索,但是通过与非PORO对象相比较的例子,我们找不到更简单的答案。

任何人都可以进行实际比较吗?

如果这是一个超级新手问题,请提前道歉。

2 个答案:

答案 0 :(得分:3)

真的没有“普通的旧Ruby对象”这样的东西,无论如何一切都是一个对象,所以没有“简单”的概念。你会如何定义非平原?

这与JavaScript不同,JavaScript中有简单的对象原语,然后是使用ES6 sed 's~D:/Oracle/~/u01/app/~; s~\\~/~g' 构造等更正式声明的其他原语。作为容器传递的JavaScript对象是一种常见模式。 Ruby中的等价物将传递一个复杂的数据结构,如具有潜在嵌套元素的Hash。

如果你想知道一个对象的类:

class

如果你想知道这是什么继承的:

@a_form.class

Ruby中有匿名类,用@a_form.superclass # Immediate parent @a_form.class.ancestors # All base classes and mixin modules 创建的对象,用这些创建的对象尽可能简单,但它们仍然是一流的对象。

答案 1 :(得分:2)

PORO(代表Plain Old Ruby Object)和not-PORO之间的区别不是技术性的。所有对象在技术上都是Ruby对象

相反,在谈论像Rails这样的大型框架时,有时会使用术语PORO,这些框架倾向于使用像ActiveRecord模型这样的“大”,“复杂”对象来实现其大部分逻辑。这些大对象往往包含大量逻辑和定义的行为。

在谈论PORO时,它通常要区别于这些大型对象,并鼓励使用较小的特定类/对象来构建业务逻辑。这些对象通常不需要由稳定存储支持,因为ActiveRecord模型通常只包含正在进行的数据并定义业务逻辑(通常称为应用程序的行为)。

但同样,这不是技术上的区别,也不是一个有明确界限的区别。这是一种社会区分,通常旨在鼓励在单一框架之外进行思考。

至于术语本身,它是相对较新的(你现在可能已经猜到了),它几乎没有任何实际的硬性含义。它最近流行起来,人们抱怨大型Rails应用程序现在倾向于拥有的结构(精益控制器,胖模型),即将整个业务逻辑放入ActiveRecord模型中。因此,这个术语大多只是与这些脂肪模型的区别。