我最近发现在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)
的转变。
所以,我想知道:哪些红宝石原则/规则反对上述代码?
编辑:哎呀,我写的是“基于键盘的”,但当然意味着“基于关键字”。要强调这一点:我不是在寻找行为类似于in的方法?方法;我正在寻找没有用Ruby实现的原因。
答案 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