2017-06-25 92 views
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 

回答

1

我不知道在语言中这样做的方法。您可以通过让actionReceiver实例为输入手动执行此操作,然后在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 
+0

我相信,大多数语言都更乐意只需要调用'thing.defineSomething {thing.methodB()}'这不完全一样,但要简单得多。也可以通过传递'#selector'来实现。 – Sulthan

+0

我正在考虑从内部的DSL实施。这两种解决方案都是功能性的,但是对于这些方法而言,它并不是非常优雅。 – nPn

+0

斯威夫特仍在不断发展。这是可以/应该在未来版本中添加的内容。 – vacawama

相关问题