Ruby method 學習筆記

2021-06-18 16:18:55 字數 3998 閱讀 4409

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開發人員可以快速地支援實現這些模式的服務和應用程式。他們將在任...