Ruby可以向Number类和其他核心类型添加方法,以获得如下效果:

1.should_equal(1)

但Python似乎无法做到这一点.这是真的吗?如果是,为什么?这与type不能被修改这一事实有关吗?

Update: Rather than talking about different definitions of monkey patching, I would like to just focus on the example above. I have already concluded that it cannot be done as a few of you have answered. But I would like a more detailed explanation of why it cannot be done, and maybe what feature, if available in Python, would allow this.

回答你们中的一些人:我想这样做的原因只是美观/可读性.

 item.price.should_equal(19.99)

这读起来更像英语,清楚地表明哪一个是测试值,哪一个是预期值,应该是:

should_equal(item.price, 19.99)

这个概念是Rspec和其他一些Ruby框架的基础.

推荐答案

你说的猴斑到底是什么意思?有several slightly different definitions个.

如果你的意思是"你能在运行时更改类的方法吗?",那么答案肯定是肯定的:

class Foo:
  pass # dummy class

Foo.bar = lambda self: 42

x = Foo()
print x.bar()

如果你的意思是,"你能在运行时改变一个类的方法吗?"那么答案也是肯定的.只需稍微改变一下顺序:

class Foo:
  pass # dummy class

x = Foo()

Foo.bar = lambda self: 42

print x.bar()

但对于某些内置类,比如intfloat,不能这样做.这些类的方法是用C实现的,为了使实现更简单、更高效,牺牲了某些抽象.

我不太清楚你是否想要改变内置数值类的行为.如果你需要改变他们的行为!!

Ruby相关问答推荐

为什么非数字在Ruby中被转换为integer?

重写 Enum#inject 以在 Ruby 中将符号作为参数

Python 正则表达式是否等同于 Ruby 的原子分组?

Simple_form:删除带有标签的内联复选框的外部标签

构造Ruby的现代方法是什么?

Nokogiri/Xpath 命名空间查询

在 Ruby 中导出环境变量

Ruby 的 Object#taint 和 Object#trust 方法是什么?

判断文件是否包含字符串

Coffeescript 中等效的 Ruby .times

Ruby:如何卸载设计(uninstall Devise)?

在 RSpec 测试期间 suppress 控制台输出

rspec 是否有比 target.should < 6 更具体的东西?

确定一个值是否存在于哈希数组中

如何在数组中找到出现次数最多的项目

to_proc 方法是什么意思?

了解 ruby​​-prof 输出

将 CSV 文件转换为哈希数组

如何在 Ruby 的 IRB 中启用自动完成

Eclipse 的首选 Ruby 插件?