初學RUBY時,一看各種稍微複雜一點的代碼時很容易被RUBY各種約定的表示方法搞暈,這整理一下 。
(若標識符首位是小寫字母或“_”,則該標識符就是局部變數或方法調用。)
(以大寫字母([A-Z])開始的標識符是常數、類名或者模組名)
以@開始的變數是執行個體變數,它屬於特定的對象。可以在類或子類的方法中引用執行個體變數。
若引用尚未被初始化的執行個體變數的話,其值為nil。Ruby的執行個體變數無須聲明,每個執行個體變數都是在第一次出現時動態加入對象。Ruby的執行個體變數通常在方法中定義類聲明——當在方法裡聲明執行個體變數時,該執行個體變數實際上屬於該方法所在類的執行個體,而不是屬於該方法。例如
class Apple # 定義第一個方法 def info1 # 輸出執行個體變數@a puts @a end # 定義第二個方法 def info2 # 為執行個體變數賦值 @a = "Hello"; end end # 建立Apple類執行個體 apple = Apple.new # 調用方法 apple.info2 apple.info1
以@@開始的變數是類變數。在類的定義中定義類變數,可以在類的特殊方法、執行個體方法等處對類變數進行引用/賦值:
class Foo @@foo = 1 def bar puts @@foo endend
類變數與常數的區別如下。
- 可以重複賦值(常數則會發出警告)
- 不能在類的外部直接引用(在繼承類中則可以引用/賦值)
類變數與類的執行個體變數的區別如下。
- 可在子類中引用/賦值
- 可在執行個體方法中引用/賦值
可以把類變數看作一種被類、子類以及它們的執行個體所共用的全域變數。
class Foo @@foo = 1endclass Bar < Foo p @@foo += 1 # => 2endclass Baz < Bar p @@foo += 1 # => 3end
模組中定義的類變數(模組變數)被所有包含該模組的類所共用。
module Foo @@foo = 1endclass Bar include Foo p @@foo += 1 # => 2endclass Baz include Foo p @@foo += 1 # => 3end
以$開始的變數是全域變數,可以在程式的任何地方加以引用(因此需要特別留意)。全域變數無需變數聲明。引用尚未初始化的全域變數時,其值為 nil。
%標記法(百分比符號標記法):
%{String} 用於建立一個使用雙引號括起來的字串
%Q{String} 用於建立一個使用雙引號括起來的字串
%q{String} 用於建立一個使用單引號括起來的字串
%r{String} 用於建立一個Regex字面值
%w{String} 用於將一個字串以空白字元切分成一個字串數組,進行較少替換
%W{String} 用於將一個字串以空白字元切分成一個字串數組,進行較多替換
%s{String} 用於產生一個符號對象
%x{String} 用於執行String所代表的命令
"%05d" % 123 » "00123"
"%-5s: %08x" % [ "ID", self.id ] » "ID:200e1670"
# 用來調用一個方法,
*號:
若左邊最後一個運算式前帶*的話,則將右邊多餘的元素以數組的形式代入這個帶*的運算式中。若右邊沒有多餘元素的話,就把空數組代入其中。
*foo = 1, 2, 3 # foo = [1, 2, 3]foo,*bar = 1, 2, 3 # foo = 1; bar = [2, 3]
*用在方法定義中表示可變長的變數:
【FROM “ProgrammingRuby”】
Variable-Length Argument Lists
But what if you want to pass in a variable number of arguments, or want to capture multiple arguments into a single parameter? Placing an asterisk before the name of the parameter after the ``normal'' parameters does just that.
def varargs(arg1, *rest) "Got #{arg1} and #{rest.join(', ')}"endvarargs("one") » "Got one and "varargs("one", "two") » "Got one and two"varargs "one", "two", "three" » "Got one and two, three"
irb(main):005:0> def call_back(*a)irb(main):006:1> a.each do |arg|irb(main):007:2* puts argirb(main):008:2> endirb(main):009:1> end=> nilirb(main):011:0> call_back(["hello",99])hello99=> [["hello", 99]]irb(main):012:0> call_back(["hello",99],"hello",99)hello99hello99=> [["hello", 99], "hello", 99]
其他用法:
C:\Users\Administrator>irb
irb(main):001:0> [1,2,3] * "hi"
=> "1hi2hi3"
irb(main):002:0> [1,2,3] * ";"
=> "1;2;3"
irb(main):003:0> [1,2,3] * 3
=> [1, 2, 3, 1, 2, 3, 1, 2, 3]
irb(main):004:0> "hi" * 3
=> "hihihi"