加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 04:54:03 所属栏目:百科 来源:网络整理
导读:在 Swift中,扩展是一种在事后定义类成员的方法.或者,你可以说,它是(来自一个全新的)组合函数的奇特方式: extension Double { var mm: Double { return self * 1_000.0 } func mm1() - Double { return self * 1_000.0 }}func mm(a: Double) - Double { retu
在 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中的猴子修补功能与扩展名不同.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读