通过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):返回自我在这里,Stuff使用next和iter魔术方法使自己可迭代(成为可迭代对象)。对于Stuff()中的数据:print(data)但是,在Ruby用法中,您做的恰恰相反。您将创建foras一个需要代码(主体)运行的方法。Ruby将过程代码放在代码块中,以便它们可以传递。然后,在每个方法中,使用yield与代码块交互,将值传递给代码块来做你需要它做的事情(代码块是任何方法的隐式参数)。如果我们重写上面的代码,它将看起来像这样:).each做|item|putsitem不是将数据传递给for循环(Python),而是将循环代码传递给数据(Ruby)。但区别远不止于此:Python为各种处理构建类似for的结构;Ruby将数据处理工作放在方法中。好的Python代码使用列表和字典理解表达式来实现映射和过滤器。这些表达式的核心与for/iteration语义相同。In[2]:[Stuff()中项目的项目]Out[2]:[1,2,3,4]In[3]:[Stuff()中项目的项目ifitem%2==0]Out[3]:[2,4]Ruby继续使用method-first方法。除了each方法之外,还有一系列常用的处理集合的新方法,如下:classStuff...defselectout=[]eachdo|e|#如果块在e上返回truthy,附加到outifyield(e)out<
