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