2016-05-08 15 views
4

スウィフトでは、延長は、のファクトの後にクラスのメンバーを定義する方法です。機能を構成するのか、あなたが言うことができる、それが(合計初心者くさいから来る)される空想方法: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") 

私はこのような何かを見たことがありません。このようなことは他の言語でもありますか?

+0

C#のようなものがあります:https://msdn.microsoft.com/en-us/library/bb383977(v=vs.110).aspx – hnh

+0

JavaScriptクラスはプロトタイプを使用しています(ただし、配列などの組み込み関数には強く推奨されません)。あるいは直接的には、私は、Goが構造化されている方法では、他の方法で定義されたメソッドを持つことは不可能だと考えています。同様の原則は、構造体を操作するいくつかの関数(派手な構文を持たないオブジェクト指向)を作った場合、C言語にも当てはまります。 – Dave

+0

ああ、もちろんSmalltalkとObjCはカテゴリを使って行うことができます。これらの拡張機能はSwift拡張機能とは異なりますが(monkey-patch ;-)。 https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html – hnh

答えて

0

これはサルのパッチと呼ばれます。 Rubyのような他の言語をサポートしています

+4

私はスイフトの拡張をサルのパッチとして考えている人は誰も疑いがありません。それらは、コンパイル単位にモジュールを定義するモジュールをインポートしないかぎり有効にならない独立した拡張です。これは、JavaScript、ObjC、Rubyのサルパッチの人々とはまったく異なります。 – hnh

+1

@hnh私は孤立しているとは思わないか、定義を変更しないと思います。それは猿のように見えますが、それは猿のように機能しますし、それは猿です – texasbruce

+1

それは猿かもしれませんが、それはパッチではないということです;-)私は猿のパッチの重要な点は、メソッドの置き換えや追加を行う言語の動的ランタイムたとえば、JSオブジェクトのキーのバインディングを新しい関数に再定義するか、ObjCのメソッドスウィズリングで同様のことを行います。迅速な拡張はそれほど何もありません。何もパッチが当てられず、すべてがきれいに分かれていて、周りは猿ではありません。 – hnh

関連する問題