【发布时间】:2012-04-14 11:43:28
【问题描述】:
我一直在为一个班级项目学习 Ruby on Rails。我不断听到“Ruby 中的一切都是对象”。我不确定我是否理解为什么这是一件好事,或者如果这是一件好事?
【问题讨论】:
-
简答:一致性和灵活性(读作“利刃”)。
-
好是什么意思?我认为这个问题的答案会因个人意见而异。
标签: ruby-on-rails ruby oop
我一直在为一个班级项目学习 Ruby on Rails。我不断听到“Ruby 中的一切都是对象”。我不确定我是否理解为什么这是一件好事,或者如果这是一件好事?
【问题讨论】:
标签: ruby-on-rails ruby oop
一个反例是在 Java 中Integer 是一个对象,但int 不是,这意味着不同的操作适用于两者(诚然,在最近的 Java 中,可以自动转换为对象版本,但这可以引入意外的性能问题)。对象由于间接而慢一点,但更灵活;一切都是对象意味着一切都表现一致。 Java 又是一个例子:数组不是对象,ArrayIterator 是事后固定的东西(甚至有多个第三方实现),因此与集合类迭代器的工作方式不太一致。
【讨论】:
null 和 undefined 不是对象,所以当你期待一个数组时,你不能只说 if (param.length),而 param 可能可能是null。在 Ruby 中,您可以修改 nil 以拥有自定义方法(例如 Rails 中的 blank?,所有对象都会响应)。
它使 Ruby 非常灵活。数字和其他原始类型可以更改或扩展。
这也可以产生非常优雅的语法:
5.times { print "print this 5 times" }
【讨论】:
Ruby 中的一切都不是一个对象(是的,我知道人们在说这句话时通常是什么意思,但它仍然不完全正确)。说“Ruby 中的一切都评估为一个对象”更合适。这是一个有趣的见解,为了更恰当的阐述,我将简单地引用大卫布莱克。很好读:
【讨论】:
正如其他人已经指出的那样,在 Java 等其他语言中,除了对象之外还有原语。对于编译器和计算机来说,获得最高效的代码是一件好事,但是,程序员需要根据他们正在处理的函数和方法使用不同的函数和方法。
由于 Ruby 是为人类而非计算机设计的,因此为了人类的生产力而牺牲一点计算资源被认为是好的。因此,Ruby 从来没有区分对象和原语。它肯定也降低了新手的学习曲线。在内部,Ruby 正在使用一种称为标记指针的技术,据我所知,由于缺少原语而导致的性能损失并没有那么糟糕。
另一件值得注意的事情是,在 Ruby 中,类也是对象,这意味着即使代码正在运行,您也可以轻松地修改类及其行为。这种动态特性赋予了程序员如此大的权力,而 Ruby 代码往往看起来非常简洁。 Ruby on Rails 充分利用了 Ruby 语言的这种动态特性。
【讨论】: