2017-06-25 13 views
0

ruby​​では、ブロックをメソッドに渡して、ブロックを受信オブジェクトのコンテキストで評価させることができます。次の出力生成Swiftに相当するRubyのinstance_evalはありますか?

class Receiver 

    def method_a 
     puts "hello from method_a" 
    end 

    def method_b 
     puts "hello from method_b" 
    end 

    def define_something &action 
     method_a 
     instance_eval &action 
    end 

end 

thing = Receiver.new 
thing.define_something { method_b } 

hello from method_a 
hello from method_b 

をいただきましスウィフトでこのような何かを実装するための正しい方法?

これは私が持っているものですが、もちろんXcodeはmethodBが未解決の識別子であると不平を言います。

class Receiver { 

    func methodA() { 
     print("hello from method A") 
    } 

    func methodB() { 
     print("hello from method B") 
    } 

    func defineSomething(action:() -> Void) { 
     methodA() 
     action() 
    } 
} 

let thing = Receiver() 
thing.defineSomething { methodB() } 

ところで、これは、受信機を備えた機能タイプの考えを持つKotlinでも行うことができます。

たとえば、次の例は、rubyの例と同様の出力を生成します。

class Receiver { 
    fun methodA() = println("hello from methodA") 
    fun methodB() = println("hello from methodB") 
    fun defineSomething(action: Receiver.() -> Unit) { 
     methodA() 
     action() 
    } 
} 

fun main(args: Array<String>) { 
    val thing = Receiver() 
    thing.defineSomething { methodB() } 
} 

hello from methodA 
hello from methodB 

答えて

1

私は言語でこれを行う方法がわかりません。 actionReceiverインスタンスを入力し、action(self)defineSomething(action:)の内部で呼び出すことで、手動で行うことができます。

class Receiver { 

    func methodA() { 
     print("hello from method A") 
    } 

    func methodB() { 
     print("hello from method B") 
    } 

    func defineSomething(action: (_: Receiver) -> Void) { 
     methodA() 
     action(self) 
    } 
} 

let thing = Receiver() 
thing.defineSomething { $0.methodB() } 
hello from method A 
hello from method B 
+0

私は、ほとんどの言語は幸せがまったく同じことが、はるかに簡単である '' thing.defineSomething {thing.methodB()}だけ呼び出すこと以上であると信じています。 '#selector'を渡すことで実装することもできます。 – Sulthan

+0

私は内部DSL実装からこれについて考えていました。どちらのソリューションも機能的ですが、メソッドのプレフィックスを持たなくてもそれほどエレガントではありません。 – nPn

+0

スイフトはまだ進化しています。これは、将来のリリースで追加できるはずのものです。 – vacawama

関連する問題