为什么是“array.include? object”而不是“object.in? array”?

1 投票
6 回答
1011 浏览
提问于 2025-04-17 14:59

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

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

然后,我心里想:“嗯,为什么在Ruby中不一样呢?if 3 in arrayif array.include? 3 更容易理解。”后来我意识到,Ruby是纯面向对象的编程,这种写法是基于关键词的。

不过,我还是在想。如果Python的写法不是面向对象的,为什么在Ruby中就不能有另一种更简短、更易读的方式呢?我在思考的时候,不是想着“这个列表包含那个元素吗?”,而是“这个元素在那个列表里吗?”

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

array = [1, 2, 3, 4]

if 3.in? array
  print "Yep!
end

我看到这是一种从 list.method(element) 转变为 element.method(list) 的方式。 所以,我在想:有哪些Ruby的原则或规则反对上面提到的代码呢?

编辑:哎呀,我写成了“keyboard-based”,其实是想说“keyword-based”。为了强调这一点:我并不是在寻找像in?方法那样的写法;我想知道为什么Ruby没有这样实现。

6 个回答

0

我觉得Mark的回答最符合你的问题。对于你的目的来说,case语句的作用是反转关系,除非你在处理像模块、正则表达式这些特殊的元素。

array = [1, 2, 3, 4]

case 3; when *array
  do_something
end
0

(我对Python完全没有经验,所以我只是转述我在网上看到的内容。)

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

Python有一种叫做成员运算符的东西,用来检查一个变量是否在某个序列里,比如字符串、列表或者元组。下面是两个成员运算符的解释:

in 如果在指定的序列中找到了某个变量,就返回真(true),否则返回假(false)。

not in 如果在指定的序列中没有找到某个变量,就返回真(true),否则返回假(false)。

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

我还是个Ruby新手;我不知道有什么Ruby的原则会反对在数组前面写对象。

7

哪些Ruby的原则或规则反对上面提到的代码?

这不是Ruby的原则,而是面向对象编程(OOP)的一条基本原则,叫做封装:Fixnum类(数字类)不应该需要知道任何关于数组的事情。不过,因为数组的主要职责是存放一组对象,所以#in?#include?显然是数组应该负责的事情。

撰写回答