在Swift中是否有相当于Ruby的instance_eval?
在ruby我可以传递一个块到一个方法,并在接收对象的上下文中评估块。
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
什么是在Swift中实现这样的东西的正确方法?
这是我有,但当然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中完成,它具有接收器的functiontypes的思想。
例如下面产生类似的输出到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) { val thing = Receiver() thing.defineSomething { methodB() } } hello from methodA hello from methodB
我不知道用语言来做这件事的方法。 您可以通过将一个Receiver
实例作为输入进行手动action
,然后在defineSomething(action:)
内调用action(self)
。
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