为什么它" array.include?对象"而不是" object.in?阵列&#34 ;?

时间:2013-02-06 16:03:04

标签: python ruby arrays coding-style

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

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

然后,我心想:“嗯,为什么Ruby中有所不同?if 3 in arrayif 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)的转变。 所以,我想知道:哪些红宝石原则/规则反对上述代码?

编辑:哎呀,我写的是“基于键盘的”,但当然意味着“基于关键字”。要强调这一点:我不是在寻找行为类似于in的方法?方法;我正在寻找没有用Ruby实现的原因。

6 个答案:

答案 0 :(得分:7)

  

哪些红宝石原则/规则反对上述代码?

这不是Ruby原则,而是封装的一般OOP原则:Fixnum类不需要知道有关数组的任何信息。但是,由于Array的主要职责是包含对象集合,#in?#include?显然属于Array的职责范围。

答案 1 :(得分:0)

在rails(active_support)中有一个帮助器in?,它的工作方式与您想要的完全相同

require 'active_support/core_ext'

3.in?([1, 2, 3]) # => true

答案 2 :(得分:0)

从OO的角度来看,这是有道理的,因为include?Array的方法,而不是作为其他所有方法(或Object)的方法。

Python变体看起来只是syntactic sugar的一种形式。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

  

Python有会员运营商,可以测试会员资格   序列,例如字符串,列表或元组。有两个会员   运营商解释如下:

     

in 如果找到指定序列中的变量,则求值为true   否则就是假的。

     

not in 如果未找到变量,则求值为true   指定的顺序,否则为false。

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

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

答案 5 :(得分:0)

我认为Mark最能回答你的问题,为了你的目的,case语句具有反转关系的效果,除非你处理模块,正则表达式等元素:

array = [1, 2, 3, 4]

case 3; when *array
  do_something
end