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中完成,它具有带接收器的函数类型的思想。
例如,以下产生与红宝石示例产生的类似输出。
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