我理解以下內容:
$ ruby -e "p 'abc'.sub('a','A').sub('b', 'B')"
"ABc"
我也同意以下幾點:
echo abc | ruby -p -e "sub('a','A');sub('b', 'B')"
ABc
但:
echo abc | ruby -p -e "sub('a','A').sub('b', 'B')"
Abc
我希望結果也是“ABc”,為什么不是?二sub('b', 'B')是不能操作。
uj5u.com熱心網友回復:
這兩種情況看起來很相似,但實際上您在其中運行 Ruby 核心庫的不同方法:
在您的第一種情況下,即sub('a','A');sub('b', 'B'):
sub您在沒有指定顯式接收器的情況下運行兩者,因此您正在呼叫方法Kernel#sub。Ruby-Doc 談到了這種方法:
sub(pattern, replacement)→$_等效于
$_.sub(args),但$_如果發生替換,它將被更新。僅在指定 -p/-n 命令列選項時可用。
以下示例說明了使用和不使用接收器的區別:
$ echo abc | ruby -p -e '$_.sub("a","A").sub("b", "B"); $_'
abc
$ echo abc | ruby -p -e 'sub("a","A").sub("b", "B"); $_'
Abc
因此,在第一個示例中,您確實呼叫了Kernel#sub兩次,并且在每次呼叫之后都會$_更新。因此,$_是ABc在第二個sub已經執行之后。在由提供的整個運算式-e的末尾(即在-p選項提供的隱式回圈的末尾),$_列印出的值,您會看到ABc。
在你的第二個例子中,即
sub('a','A').sub('b', 'B')
和以前一樣,第一個sub又是Kernel#sub。它具有將字串轉換為Abc的效果,并且還設定$_為Abc。但是,第二個sub現在確實有一個明確的接收者(第一個產生的字串sub),在這種情況下,該方法String#sub被執行。此方法產生ABc,但不同的是Kernel#sub,它不會更新$_。因此,$_仍然設定為Abc,這就是您所看到的輸出。
雖然依賴某些方法對 的隱式影響似乎很方便$_,但有時更容易使操作顯式。例如,如果您執行
$_=$_.sub('a','A').sub('b','B')
你可以清楚地看到發生了什么。另一種選擇是
$_.sub!('a','A');$_.sub!('b','B')
請注意,在最后一種情況下,您不想將兩者鏈接起來sub!,因為 String#sub! nil如果沒有執行替換,則回傳。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/489079.html
標籤:红宝石
上一篇:使用關系計數和性能查詢模型資料
