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
私は、ほとんどの言語は幸せがまったく同じことが、はるかに簡単である '' thing.defineSomething {thing.methodB()}だけ呼び出すこと以上であると信じています。 '#selector'を渡すことで実装することもできます。 – Sulthan
私は内部DSL実装からこれについて考えていました。どちらのソリューションも機能的ですが、メソッドのプレフィックスを持たなくてもそれほどエレガントではありません。 – nPn
スイフトはまだ進化しています。これは、将来のリリースで追加できるはずのものです。 – vacawama