为什么是“array.include? object”而不是“object.in? array”?
我最近发现,在Python中,你可以这样写:
array = [1, 2, 3, 4]
if 3 in array:
print("Yep!")
然后,我心里想:“嗯,为什么在Ruby中不一样呢?if 3 in array
比 if 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 个回答
我觉得Mark的回答最符合你的问题。对于你的目的来说,case
语句的作用是反转关系,除非你在处理像模块、正则表达式这些特殊的元素。
array = [1, 2, 3, 4]
case 3; when *array
do_something
end
(我对Python完全没有经验,所以我只是转述我在网上看到的内容。)
in
是Python中的一个运算符,而不是一个方法。
Python有一种叫做成员运算符的东西,用来检查一个变量是否在某个序列里,比如字符串、列表或者元组。下面是两个成员运算符的解释:
in
如果在指定的序列中找到了某个变量,就返回真(true),否则返回假(false)。
not in
如果在指定的序列中没有找到某个变量,就返回真(true),否则返回假(false)。
http://www.tutorialspoint.com/python/python_basic_operators.htm
我还是个Ruby新手;我不知道有什么Ruby的原则会反对在数组前面写对象。
哪些Ruby的原则或规则反对上面提到的代码?
这不是Ruby的原则,而是面向对象编程(OOP)的一条基本原则,叫做封装:Fixnum类(数字类)不应该需要知道任何关于数组的事情。不过,因为数组的主要职责是存放一组对象,所以#in?
或#include?
显然是数组应该负责的事情。