ruby 關於method一、 定義方法
使用關鍵字 def
方法名稱以小寫字母或下劃線開頭,後面跟著字母、數字和下劃線
有的方法名後面跟著?,!或=
方法名有?通常意味著方法返回boolean型結果
例:1.even? # => false
2.even? # => true
1.instance_of?(fixnum) # => true
方法名後有!,則此方法的接收者將被修改
方法名後加=,通常意味著賦值
ruby方法的引數可以設定預設值
def cool_dude(arg1="miles", arg2="coltrane", arg3="roach")
"#, #, #."
endcool_dude # => "miles, coltrane, roach."
cool_dude("bart") # => "bart, coltrane, roach."
cool_dude("bart", "elwood") # => "bart, elwood, roach."
cool_dude("bart", "elwood", "linus") # => "bart, elwood, linus."
二、可變長度的引數
在引數前加*號,用以接收多個引數值或可變引數值
def varargs(arg1, *rest)
"arg1=#. rest=#"
endvarargs("one") # => arg1=one. rest=
varargs("one", "two") # => arg1=one. rest=[two]
varargs "one", "two", "three" # => arg1=one. rest=[two, three]
使用*號表示乙個在方法中不使用,但可能在父類中使用到的引數
class child < parent
def do_something(*not_used)
# our processing
super
endend這種情況下,可以不需要寫引數名稱,只使用*表示引數
class child < parent
def do_something(*)
# our processing
super
endend在ruby1.9中,我們可以把此類引數放在任何位置,如:
def split_apart(first, *splat, last)
puts "first: #, splat: #, " +
"last: #"
endsplit_apart(1,2)
split_apart(1,2,3)
split_apart(1,2,3,4)
produces:
first: 1, splat: , last: 2
first: 1, splat: [2], last: 3
first: 1, splat: [2, 3], last: 4
三、方法和block
在方法中使用block通常使用yield
def double(p1)
yield(p1*2)
enddouble(3) " } # => "i got 6"
double("tom") " } # => "then i got tomtom"
然而,如果方法定義中的最後乙個引數以&開頭,則,所有相關的block都會轉換為proc物件。
class taxcalculator
def initialize(name, █)
@name, @block = name, block
enddef get_tax(amount)
"#@name on # = #"
endendtc = taxcalculator.new("sales tax")
tc.get_tax(100) # => "sales tax on 100 = 7.5"
tc.get_tax(250) # => "sales tax on 250 = 18.75"
四、方法呼叫
方法的預設接收者為self
在乙個類方法或module中的方法,接收者為類或module的名稱
五、把引數傳給乙個方法
六、方法的返回值
每乙個呼叫的方法都會有乙個返回值。方法的返回值是最後乙個語句執行的結果
def meth_one
"one"
endmeth_one # => "one"
def meth_two(arg)
case
when arg > 0 then "positive"
when arg < 0 then "negative"
else "zero"
endendmeth_two(23) # => "positive"
meth_two(0) # => "zero"
ruby有乙個關於return 的語句
如果return多個值,則方法會返回乙個陣列
def meth_three
100.times do |num|
square = num*num
return num, square if square > 1000
endendmeth_three # => [32, 1024]
num, square = meth_three
num # => 32
square # => 1024
七、splat,將擴張集合到方法呼叫中
這個是ruby1.9中的特性
之前我們看到在方法定義的引數中,在引數前加*,可以將多個引數值傳給乙個引數,
這裡正好相反。
呼叫乙個方法時,你可以把任意的集合或列舉型物件轉變成組合的元素,然後把這些元素傳遞給單獨的引數了。在傳遞的陣列引數前加上*。
def five(a, b, c, d, e)
"i was passed # # # # #"
endfive(1, 2, 3, 4, 5 ) # => "i was passed 1 2 3 4 5"
five(1, 2, 3, *['a', 'b']) # => "i was passed 1 2 3 a b"
five(*['a', 'b'], 1, 2, 3) # => "i was passed a b 1 2 3"
five(*(10..14)) # => "i was passed 10 11 12 13 14"
five(*[1,2], 3, *(4..5)) # => "i was passed 1 2 3 4 5"
八、讓blocks更加動態一些
如果方法的最後乙個引數值有&,ruby假定這是乙個proc物件,ruby會把該proc 物件轉換為乙個block,然後在方法中使用。
九、收集hash變數
一般方法中,引數值對應一定的引數變數,傳遞引數就需要按照一定的順序。
在ruby中可以使用hash的鍵值對,來傳遞引數。
class songlist
def search(name, params)
# ...
endendlist.search(:titles,
)此處,可以將hash作為乙個鍵=>值引數列表。
list.search(:titles,
:genre => 'jazz',
:duration_less_than => 270)
在ruby1.9中,可以寫成:
list.search(:titles, genre: 'jazz', duration_less_than: 270)
遺留問題:
1. proc
2. lambda
ps:再次複習相關ruby的基礎知識,還是很有必要的,有所收穫。
看一段和寫這篇文章居然用了兩天時間,無比慚愧。不管是什麼藉口,都覺得自己不應該!
好好思考一下吧,自己現在還是不成熟,整天浪費時間!
學習筆記 雜湊學習筆記
hash基本原理 hash就是乙個像函式一樣的東西,你放進去乙個值,它給你輸出來乙個值。輸出的值就是hash值。一般hash值會比原來的值更好儲存 更小 或比較。那字串hash就非常好理解了。就是把字串轉換成乙個整數的函式。而且要盡量做到使字串對應唯一的hash值。它的主要思路是選取恰當的進製,可以...
學習筆記 CentOS 學習筆記01
簡單的做個課堂筆記 虛擬機器用的是vmware,系統是centos cd etc sysconfig network scripts pwdls 顯示列表 cat ifcfg eth0 檢視檔案內容 vi ifcfg eth0 進入vi編輯器 onboot no 原始設定 x逐字刪除 d刪除整行 a...
筆記 spring cloud 學習筆記
1 spring cloud 是什麼 spring cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具 例如配置管理,服務發現,斷路器,智慧型路由,微 控制匯流排 分布式系統的協調導致了樣板模式,使用spring cloud開發人員可以快速地支援實現這些模式的服務和應用程式。他們將在任...