还有其他语言有类似Swift的扩展吗?

时间:2016-05-08 20:51:54

标签: swift methods swift-extensions member-functions

在Swift中,扩展是一种在事实之后定义类成员的方法。或者,你可以说,它是(来自一个全新的)组合函数的奇特方式:

extension Double {
    var mm: Double { return self * 1_000.0 }
    func mm1() -> Double { return self * 1_000.0 }
}

func mm(a: Double) -> Double {
    return a * 1_000.0
}

print("One meter is \(1.mm) milimeters")
print("One meter is \(1.mm1()) milimeters")
print("One meter is \(mm(1)) milimeters")

我从未见过这样的事情。在任何其他语言中都有这样的东西吗?

2 个答案:

答案 0 :(得分:0)

是的,其他语言具有扩展功能。正如@hnh指出C# has a very similar feature

这也清楚表明此功能不是不是“猴子修补程序”

  

扩展方法是一种特殊的静态方法,但它们的调用就像是扩展类型上的实例方法一样

换句话说,扩展更像是语法糖。给定问题中的示例Double,您可以制作一个采用Double的函数(如问题所示)

func mm(a: Double) -> Double {
    return a * 1_000.0
}

然后您可以直接调用

var foo = 12.34;
print("One meter is \(mm(foo)) millimeters")

C#和Swift中的扩展实际上发生了什么,那就是扩展告诉编译器在后台进行翻译

someDouble.mm()

进入

mm(someDouble)

或者在我们的情况下更像

__extension_for_type_Double_mm(someDouble as self)

因此,没有补丁。

这也意味着您可以在不同的模块中拥有多个mm扩展名,并通过仅在该文件中导入该模块来选择每个文件使用哪个扩展名,就像其他文件可以为该文件导入另一个扩展名的模块一样具有相同名称的相同类型。对于猴子修补,这是不可能的,因为对象或其类/原型已被修补(某些实际更改)。这里,什么都没有改变,只是调用独立函数的语法糖。

这意味着Ruby和JavaScript中的猴子补丁等功能与扩展名不同。

答案 1 :(得分:-1)

这叫做猴子补丁。还有一些其他语言支持它,如Ruby