簡體   English   中英

這個反引紅寶石代碼是什么意思?

[英]what does this backtick ruby code mean?

while line = gets
   next if line =~ /^\s*#/    # skip comments
   break if line =~ /^END/   # stop at end

   #substitute stuff in backticks and try again
   redo if line.gsub!(/`(.*?)`/) { eval($1) } 

結束

我不明白的是這一行:

line.gsub!(/`(.*?)`/) { eval($1) }
  1. 什么是gsub! 到底怎么辦?
  2. 正則表達式的含義(。*?)
  3. 塊的含義{eval($ 1)}
  1. 它將line的匹配部分內替換,即塊的結果。
  2. 它將匹配前一個子表達式的0或更多(即'。',匹配任何一個char)。 ? 修改.* RE,使其匹配不超過繼續匹配后續RE元素所必需的。 這被稱為“非貪婪”。 沒有? .*也可能匹配第二個反引號,具體取決於行的其余部分,然后整個表達式可能會失敗。
  3. 該塊返回反向引用的eval結果(“評估Ruby表達式”),反向引用是反向刻度字符之間字符串的一部分。 這由$1指定,它指的是RE的第一個paren封閉部分(“反向引用”)。

在大圖中,所有這些的結果是包含反引號括號表達式的行將反引號(和反引號)中的部分替換為執行包含的Ruby表達式的結果值。 並且由於外部塊受到redo ,因此循環將立即重復而不重新運行while條件。 這意味着得到的表達式也需要進行反引號評估。

替換反引號之間的一切line與評估其中所包含的代碼紅寶石的結果。

>> line = "one plus two equals `1+2`"
>> line.gsub!(/`(.*?)`/) { eval($1) }
>> p line
=> "one plus two equals 3"

.*匹配零個或多個字符, ? 使它不貪婪(即,它將采用最短的匹配而不是最長的匹配)。

$1是匹配()之間的東西的字符串。 在上面的例子中, $1將被設置為"1+2" eval將字符串計算為ruby代碼。

line.gsub!(/ (。*?) /) { eval($1) }

  1. GSUB! 替換行(相反,如果使用line = line.gsub)。
  2. 。*? 所以它只匹配到第一個`,否則它將取代多個匹配。
  3. 該塊執行它匹配的任何內容(例如,如果“line”包含1+1 ,則eval將其替換為2。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM