2017-06-25 76 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

相關問題