我試圖證明您可以將子例程存盤在變數中(除非您不能)。有沒有可能我只是把這段代碼弄錯了?
我有這個來自 Python 的代碼,它可以做我想做的事
def printSample(str)
puts str
end
x = printSample
str = "Hello"
x(str)
預期輸出:
你好
我是 Ruby 的初學者,只是想學習基本的代碼。
uj5u.com熱心網友回復:
您的 Python 代碼可以翻譯為 Ruby,如下所示:
def print_sample(str)
puts str
end
x = method(:print_sample)
str = "Hello"
x.(str)
主要區別在于,由于 Ruby 中的括號是可選的,因此撰寫時x = print_sample已經呼叫了該方法。檢索稍后可以呼叫的Method物件要復雜一些:您必須以method符號或字串的形式呼叫和傳遞方法名稱。(接收者是在其中定義方法的物件)
并且由于方法物件是常規物件,因此實際呼叫方法的語法也略有不同。Ruby 提供:
x[str]
x.(str)
x.call(str)
與x.(str)for 的語法糖x.call(str),見Method#call
另一種方法是只存盤方法名稱并通過send/動態呼叫方法public_send,例如:
x = :print_sample
str = "Hello"
send(x, str)
通過它們的(符號化的)名稱來參考方法在 Ruby 中是非常慣用的。
uj5u.com熱心網友回復:
處理實體方法的示例:
class Demo
def initialize(s); @s = s; end
def printSample(str); puts(@s str); end
end
x = Demo.instance_method(:printSample)
# x is now of class UnboundMethod
aDemo = Demo.new("Hi")
# Use x
x.bind(aDemo).call("You") # Outputs: HiYou
在本例中,我們首先存盤方法,然后將其應用到實體。如果你先有實體,然后想獲取方法,那就更簡單了。假設Demo從上面的類定義,你同樣可以做一個
aDemo = Demo.new("Hi")
y = aDemo.method(:printSample)
y.call("You")
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/373358.html
上一篇:通過正則運算式獲取逗號分隔的數字
