在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