通过for循环在很大程度上可以看出Ruby和Python的区别。Python有一个for语句。对象告诉for如何合作,for循环体处理对象返回的内容。Ruby则相反。在Ruby中,它本身(通过each)是一个对象的方法。调用者将for循环的主体传递给此方法。在Python的语言习语中,对象模型从属于for循环。然而,在Ruby中,for循环遵循对象模型。也就是说,在Python中,如果要自定义迭代过程,可以让对象告诉解释器如何迭代:classStuff:def__init__(self):self.a_list=[1,2,3,4]self.position=0def__next__(self):try:value=self.a_list[self.position]self.position+=1returnvalueexceptIndexError:self.position=0raiseStopIterationdef__iter__(self):returnsself这里,Stuff使用__next__和__iter__魔法方法Iterate(成为一个可迭代的对象)。fordatainStuff():print(data)但是,在Ruby用法中,您做的恰恰相反。您将for创建为一种方法,该方法需要代码(主体)来运行。Ruby将过程代码放在代码块中,以便它们可以传递。然后,在每个方法中,使用yield与代码块交互,将值传递给代码块来做你需要它做的事情(代码块是任何方法的隐式参数)。如果我们改写上面的代码,就会变成这样:classStuffdefinitialize@a_list=[1,2,3,4]enddefeachforitemin@a_listyieldiitemendend使用each进行迭代:Stuff.new().eachdo|item|putsitemend不传数据给for循环(Python),但将循环代码传递给数据(Ruby)。但区别远不止于此:Python为各种处理构建类似for的结构;Ruby将数据处理工作放在方法中。好的Python代码使用列表和字典理解表达式来实现映射和过滤器。这些表达式的核心与for/iteration语义相同。In[2]:[itemforiteminStuff()]Out[2]:[1,2,3,4]In[3]:[itemforiteminStuff()ifitem%2==0]Out[3]:[2,4]Ruby继续使用方法优先的方法。除了each方法之外,还有一系列常用的处理集合的新方法,如下:Onelineblocksyntax,appendoutputofblockprocessedonetoouteach{|e|out<
