class Package:
def __init__(self):
self.files = []
# ...
def __del__(self):
for file in self.files:
os.unlink(file)
Run Code Online (Sandbox Code Playgroud)
__del__(self)上面因AttributeError异常而失败.我理解Python在__del__()调用时不保证存在"全局变量"(在此上下文中的成员数据?).如果是这种情况并且这是异常的原因,我该如何确保对象正确破坏?
有很多关于Python与Ruby的讨论,我发现它们完全没有用,因为它们都转向了为什么功能X在语言Y中很糟糕,或者声称语言Y没有X,尽管事实上确实如此.我也确切地知道为什么我更喜欢Python,但这也是主观的,并且不会帮助任何人选择,因为他们可能没有和我一样的开发品味.
因此,客观地列出差异将是有趣的.所以没有"Python的lambdas糟透了".而是解释Ruby的lambdas可以做什么,Python不能.没有主观性.示例代码很好!
请不要在一个答案中有几个不同之处.并且对那些你认识的是正确的进行投票,然后对你所知道的那些是不正确的(或者是主观的).此外,语法上的差异也不大.我们知道Python使用缩进来处理Ruby用括号和结尾做什么,并且@在Python中称为self.
更新:这是一个社区维基,所以我们可以在这里添加很大的差异.
在Ruby中,您可以在类主体中引用类(self).在Python中,在类构造完成之前,您没有对类的引用.
一个例子:
class Kaka
puts self
end
Run Code Online (Sandbox Code Playgroud)
在这种情况下,self就是类,这段代码会打印出"Kaka".无法打印出类名或以其他方式从Python中的类定义体(外部方法定义)访问该类.
这使您可以开发核心类的扩展.以下是rails扩展的示例:
class String
def starts_with?(other)
head = self[0, other.length]
head == other
end
end
Run Code Online (Sandbox Code Playgroud)
Python(想象没有''.startswith方法):
def starts_with(s, prefix):
return s[:len(prefix)] == prefix
Run Code Online (Sandbox Code Playgroud)
您可以在任何序列(不仅仅是字符串)上使用它.为了使用它,你应该明确地导入它,例如,from some_module import starts_with.
Ruby拥有一流的regexp,$ -variables,awk/perl逐行输入循环和其他功能,使其更适合编写munge文本文件的小shell脚本或充当其他程序的粘合代码.
感谢callcc声明.在Python中,您可以通过各种技术创建延续,但是该语言没有内置支持.
使用"do"语句,您可以在Ruby中创建一个多行匿名函数,它将作为参数传递到do前面的方法中,并从那里调用.在Python中,您可以通过传递方法或使用生成器来执行此操作.
红宝石:
amethod { |here|
many=lines+of+code
goes(here)
}
Run Code Online (Sandbox Code Playgroud)
Python(Ruby块对应于Python中的不同构造):
with amethod() as here: # `amethod() is a context manager
many=lines+of+code
goes(here)
Run Code Online (Sandbox Code Playgroud)
要么
for here in amethod(): # `amethod()` …Run Code Online (Sandbox Code Playgroud) 我正好相反 - 我非常精通Python,但我需要尽快开始学习Ruby(以及后来的Rails,但这是另一个话题).我正在链接的问题解决了这个问题,但有没有其他资源可以为已经拥有Python经验的人教Ruby?(换句话说,有编程背景的人,但是还不知道IRB将正确执行的代码与正确的Ruby代码之间的区别.)
编辑:我不只是在寻找两种语言之间的差异列表 - 我想知道是否有任何指导/演练,旨在教Python程序员编写惯用的Ruby.我知道从其他语言迁移到 Python的类似指南,但我不知道Ruby.