在
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")
我从来没有见过这样的东西.在任何其他语言中都有这样的东西吗?
解决方法
是的其他语言具有扩展等功能.正如@hnh指出
C# has a very similar feature
它也说清楚这个功能不是“猴子补丁”
Extension methods are a special kind of static method,but they are called as if they were instance methods on the extended type
换句话说,扩展更像是语法糖.给出问题中的示例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中的猴子修补功能与扩展名不同.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。