Ruby中的常量:引號、%符號和heredoc

數值字面量

沒什麼好說的,惟一須要說明的是分數字面量:數值後加上一個後綴字母r表示分數字面量。正則表達式

# 整數字面量
0
1
100
10_000_001   # 千分位

# 浮點數字面量
0.1
1.0
1.2222

# 分數字面量
1r                  # 等價於(1/1)
2r                  # 等價於(2/1)
0.3r                # 等價於(3/10)
0.4r-0.1r           # 等於(2/5) - (1/10) == (3/10)
0.4r-0.1r == 0.3r   # true

引號

引號和Perl中的引號相似。shell

例如,單引號不解釋變量內插和反斜線序列等,雙引號解釋變量內插和反斜線序列等,反引號用於執行對應的命令。此外,反引號中能夠進行變量內插,也就是說反引號中字符的會按照雙引號進行解釋,例如a=haha;str=`echo #{a} one line`獲得的結果爲str=haha one line數組

此外,Ruby支持三引號,包括三個雙引號、三個單引號,用來實現簡單的heredoc功能。雙引號能夠進行變量內插,單引號不可變量內插:ruby

one=1
two=2
three=3

puts """
line #{one}
line #{two}
line #{three}
"""

puts '''
line #{one}
line #{two}
line #{three}
'''

%符號

%用於簡化常量的定義code

下面的中括號邊界符能夠替換爲其它對稱符號或相同的符號。例如()<>||##對象

  • %q[]:定義字符串,但不解釋內插表達式。例如%q(abc def)等價於"abc def",邊界符(即這裏的中括號[])須要使用反斜線轉義
  • %Q[]%[]:定義字符串,但解釋內插表達式。例如a="abc"時,b=%Q(#{a})等價於b="abc"
  • %w[]%W[]:定義數組,數組元素不須要引號包圍,數組元素使用空白符號(能夠是換行符)分隔
  • %i[]:建立符號數組。例如%i(Perl Python)等價於[:Perl, :Python]
  • %r[]:定義正則表達式,會解釋內插表達式。此外,正則的修飾符能夠出如今邊界符的後面,例如%r(a.*b)i表示不區分大小寫的正則對象
  • %s[]:定義符號(Symbol),不會解釋內插表達式
  • %x[]:定義要執行的shell命令,就像shell下的反引號同樣,這部分會被看成雙引號包圍,會解釋內插表達式
    • 注意,shell命令的輸出結果須要保存到變量中,不然結果被丟棄。例如a=%x(echo hahaha)表示將echo的輸出結果保存到變量a中,而%x執行的過程當中並不輸出數據
    • 它和Ruby中的反引號是同樣的。它們都是調用Kernel模塊中的`方法,因此,也能夠直接調用這個方法執行一段shell命令:Kernel.`(echo hahaha)

heredoc

heredoc和Perl的heredoc基本同樣。blog

  • <<END:等價於雙引號的heredoc
  • <<"END":按雙引號去解釋heredoc內容,因此會解釋內插表達式和反斜線序列
  • <<'END':按單引號去解釋heredoc內容,因此不會解釋內插表達式和反斜線序列
  • <<`END`:使用shell去執行heredoc的內容
str1 = <<END
one line
END
# str1="one line"

a="one line"
str2 = <<"END"
#{a}
END
# str2="one line"

a="one line"
str3 = <<'END'
#{a}
END
# str3="#{a}"

a="one line"
str4 = <<`END`
echo haha #{a}
END
# str4="haha one line"

heredoc的起始符前能夠加上一個短橫線"-",使得終止符能夠縮進編寫,還可使用~,使得正文和結束符都能縮進,但返回的結果不縮進。例如:three

str1 = <<-ONE
one line
  ONE          # 終止符ONE縮進了

str2 = <<-"TWO"
two\nline      # 換行符被解釋
  TWO

puts <<~END
  one line    # 結果中,這兩行沒縮進
  two line
END

heredoc的起始行中起始符後面的內容不會被解釋。因此:字符串

arr = [<<END, "two", "three"]  # END後面的不會解釋
one line
END

# arr = ["one line", "two", "three"]

事實上,當Ruby解釋器遇到<<的時候就當即跳轉到它下面的行中讀取數據直到遇到結尾符號,而後從新回到here doc的開頭行繼續向後讀取,因此上面<<ENDEND中間的行先被讀取,讀取完END以後回頭讀two、three字符串。class

heredoc能夠堆疊多個doc棧。例如:

arr = [<<ONE, <<TWO, <<THREE,]
one line
ONE
two line
TWO
three line
THREE

# arr=["one line", "two line", "three line"]
相關文章
相關標籤/搜索