1

我最近发现在 Python 中,你可以这样做:

array = [1, 2, 3, 4]
if 3 in array:
  print("Yep!")

然后,我心想:“嗯,为什么它在 Ruby 中有所不同?if 3 in array比 . 更具可读性if array.include? 3。” 然后,我意识到,Ruby 是纯粹的 OOP,而且这种方法是基于关键字的。

但是,我仍然想知道。如果 Python 方法不是 OOP,为什么在 Ruby 中不能有另一种更短且更具可读性的方法?思考时,我不认为“这个列表是否包含那个元素?”,而是“这个元素在那个列表中吗?”。

假设,以下代码是可能的:

array = [1, 2, 3, 4]

if 3.in? array
  print "Yep!
end

list.method(element)我看到这是从到的转机element.method(list)。所以,我想知道:哪些 ruby​​ 原则/规则反对上述代码?

编辑:哎呀,我写了“基于键盘”,但当然意思是“基于关键字”。强调这一点:我不是在寻找表现得像 in? 方法; 我正在寻找为什么它没有以这种方式在 Ruby 中实现的原因。

4

6 回答 6

7

哪些 ruby​​ 原则/规则反对上述代码?

这不是 Ruby 原则,而是一般的 OOP 封装原则:Fixnum 类不需要了解数组的任何内容。但是,因为 Array 的主要职责是包含对象的集合,#in?或者#include?显然属于 Array 的职责。

于 2013-02-06T16:11:01.170 回答
0

在 rails (active_support) 中有一个 helper in?,它的工作原理与您想要的完全一样

require 'active_support/core_ext'

3.in?([1, 2, 3]) # => true
于 2013-02-06T16:07:31.130 回答
0

从 OO 的角度来看,这是有意义的,因为include?它是 的方法Array,而不是其他所有事物(或Object)的方法。

Python 变体看起来只是一种语法糖

于 2013-02-06T16:10:37.193 回答
0

您的最后一句话解释了您所看到的问题:您认为您应该能够询问一个对象是否存在于数组中,这是没有意义的。它如何知道如何搜索数组或类似数组的对象。

把它转过来是有道理的:“这个数组是否包含对象”。数组或类似数组的对象知道如何搜索自己,并且可以尝试将对象与数组中的元素进行比较。

于 2013-02-06T16:13:28.580 回答
0

(我的 Python 经验为零,所以我只是在转发我在互联网上阅读的内容。)

in是 Python 中的运算符,而不是方法。

Python 有成员运算符,用于测试序列中的成员,例如字符串、列表或元组。下面解释了两个成员运算符:

in如果找到指定序列中的变量,则评估为 true,否则评估为 false。

not in如果在指定序列中未找到变量,则评估为 true,否则评估为 false。

http://www.tutorialspoint.com/python/python_basic_operators.htm

我是 Ruby 新手;我不知道有任何 Ruby 原则会阻止在数组之前编写对象。

于 2013-02-06T16:26:59.227 回答
0

我认为 Mark 最好地回答了您的问题,并且出于您的目的,case除非您正在处理模块、正则表达式等元素,否则语句具有反转关系的效果:

array = [1, 2, 3, 4]

case 3; when *array
  do_something
end
于 2013-02-06T16:27:22.580 回答