亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Ruby > 正文

Ruby基礎知識之方法、代碼段

2020-10-29 19:40:57
字體:
來源:轉載
供稿:網友

Ruby中的方法是一個有名稱的代碼塊,是與一個或多個對象關聯的參數化的代碼。調用時須給出方法名,接收者(所在對象),參數值,且最后一個表達式的值做為返回值。與Ruby方法相似的是代碼塊,它沒有名字,且調用時只通過迭代器或被間接調用。
 
(一)方法
(1)定義方法

定義方法就是

復制代碼 代碼如下:

def 方法名(參數列表)
方法體
end

最后一個表達式做為返回值返回,如果有值,則返回;無值則返回nil??梢允÷詒eturn。
在類中定義的方法為實例方法,實例方法可以在類的實例對象上使用。如果是在一個特定的對象上定義方法,那么此方法就是一個單鍵方法,只能在這個對象上使用。

復制代碼 代碼如下:

class Test
  def instance_method_test(v)
    puts "#{v}: instance method"
  end 
end
 
t1=Test.new
t2=Test.new
t1.instance_method_test("t1")
t2.instance_method_test("t2")
 
def t1.singleton_method_test(v)
  puts "#{v}:singleton method"
end
 
t1.singleton_method_test("t1")
#t2.singleton_method_test("t2")

在ruby中,方法一般小寫字母開頭,如果超過一個單詞,則由下劃線隔開(看習慣)。有意思的是方法名可以以等號、問號、嘆號結尾,且有不同的意義:以等號(=)結尾表示這是一個賦值方法(寫屬性);以問號(?)結尾表示一個斷言方法,可以回答調用者提出問題的值,例如判斷大??;嘆號(!)結尾表示是一個可變方法,可能會影響到對象的狀態,要小心使用。這三個符號很有意思,但它們不是必須的。

(2)取消方法

通過undef 方法名 可以取消方法。對于被繼承的方法,undef可以取消子類中的繼承來的方法,但不會取消父類中的此方法。

(3)方法參數

在參數中添加等號和值就可以為這一個參數設置默認值。如果參數有默認值,那么在調用方法時,可以為這個參數指定值或不指定值。

復制代碼 代碼如下:

def createRole(name,level=1)
  puts "role name is#{:name} level is #{level}"
end
 
createRole("way")
createRole("clound",5)

通過在參數前邊加星號(*),可以為方法指定為可變參數個數(數組參數),且指定的個數最多為一個。
復制代碼 代碼如下:

def add_Person(*users)
  puts users
end
add_Person("a1","a2")
add_Person("a1","a2","a3")

如果要把數組傳遞給方法,要在數組前加星號(*)。

(二)代碼塊
方法調用后可以緊跟一個代碼塊,關聯代碼塊的方法可以通過yield來調用。

復制代碼 代碼如下:

def showMessage(i)
  yield i*2
  print i
end
 
showMessage(5){|x|print "#{x}"}

代碼塊通過yield調用,也可以做為方法參數傳遞,但前提是這個參數前需要添加&做為前綴且為最后一個參數。而此時它以一個proc對象傳遞,調用時不能通過yield調用,而是通過proc的call方法調用。另外,如果以顯示方式,即傳遞proc對象給方法,那方法定義的參數就不加&前綴了。通過&前綴,代碼塊可以與任何方法調用關聯起來,即使此方法沒有yield語句。任何方法調用都可以用&參數作為最后一個參數。所有支持to_proc的方法都能用&。
復制代碼 代碼如下:

#傳遞代碼塊,代碼塊參數須為最后一個,且添加&前綴;且調用時用proc的call方法
def fun_block(i,&b)
  b.call(i*2)
end
fun_block(2){|x|puts x}
 
#顯示傳遞proc對象。那么方法中proc對象部分的參數不加&前綴
def fun_proc(i,b)
  b.call(i*2)
end
p=Proc.new{|x|puts x}
fun_proc(2,p)
 
c=[1,2,3,4,5,6]
b=c.select{|x|x%2==0}
p1=Proc.new{|x|x%2==0}
d=c.select(&p1)
puts d

代碼塊是Ruby的一種句法結構,不是對象,但可以創建對象來表示一個代碼塊。根據對象的創建方式,分為proc或lambda。proc行為與代碼塊相似;lambda行為與方法相似,但它們都是Proc類的實例。
 
通過Proc.new創建一個proc,在1.9版本中,與proc方法為同義詞;通過lambda方法,創建一個lambda。lambda方法不帶參數,調用時段關聯一個代碼塊。
 
在ruby 1.9中,支持一種新的句法。將lambda換為->;將參數放到花括號外邊,小括號里邊;花括號中只保留表達式。(可以與.net3.*中的lambda比較:()=>{})
復制代碼 代碼如下:

#1.8k中
d1=lambda{|x|x+1}
puts d1.call(5)
#1.9中,將lambda換為->;參數放到花括號外邊,小括號里邊;花括號中只保留表達式
#與.net3.*中的lambda表達式很像()=>{}
d2=->(x){x+1}
d2.call(5)

這種新句法,使代碼簡潔,并使代碼段與ruby方法的統一,例如:設置參數默認值。
(三)閉包

ruby中的proc和lambda都是閉包(closure)。閉包表示一個對象既是一個可調用的函數,同時也是綁定在這個函數上的一個變量。從表面上解釋閉包就是:方法A內的方法B調用方法A的變量,并返回結果。方法B就是閉包。它的作用:一是B方法的變量可以在方法外使用;二是A方法中的變量可以安全使用;三是對B方法中的值進行緩存。
(關于閉包,可以查看相關文檔,我這里只是粗淺的認識。)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久天天躁狠狠躁夜夜躁2014| 欧美黑人又粗大| 日韩欧美精品在线观看| 91久久精品在线| 亚洲视频专区在线| 97av在线播放| 日本成人免费在线| 久久成人人人人精品欧| 亚洲欧美综合精品久久成人| 国产一区二区久久精品| 欧美性猛交xxxx乱大交极品| 性色av一区二区三区| 国语自产精品视频在线看抢先版图片| 2019国产精品自在线拍国产不卡| 欧美成人免费大片| 欧美性理论片在线观看片免费| 国产精品国产三级国产专播精品人| 日韩中文字幕av| 欧美裸身视频免费观看| 国产aⅴ夜夜欢一区二区三区| 国产欧美va欧美va香蕉在线| 欧美做爰性生交视频| 91国语精品自产拍在线观看性色| 九九热这里只有精品免费看| 国产精品一二三在线| 亚洲欧洲在线看| 中文字幕欧美精品日韩中文字幕| 午夜精品一区二区三区在线播放| 亚洲视频日韩精品| 欧美精品第一页在线播放| 亚洲欧美国内爽妇网| 欧美黑人xxxx| 精品久久久久久久久久ntr影视| 国产亚洲在线播放| www.亚洲一区| 激情av一区二区| 欧美体内谢she精2性欧美| 亚洲第一偷拍网| 欧美xxxx综合视频| 亚洲欧美另类中文字幕| 91成人免费观看网站| 色多多国产成人永久免费网站| 精品无人国产偷自产在线| 91免费人成网站在线观看18| 久久精品成人欧美大片古装| 懂色av中文一区二区三区天美| 久久久亚洲国产天美传媒修理工| 亚洲乱码av中文一区二区| 国产成人精品日本亚洲| 国产精品久久久久999| 亚洲在线www| 国产一区二区三区在线| 亚洲一区av在线播放| 欧美日韩国产成人在线| 97国产一区二区精品久久呦| 欧美裸身视频免费观看| 国产精品福利在线观看网址| 中文字幕在线亚洲| 91久久夜色精品国产网站| 国产91精品在线播放| 亚洲成人激情视频| 欧美孕妇性xx| 海角国产乱辈乱精品视频| 精品亚洲一区二区三区四区五区| 久久99久久亚洲国产| 日韩视频欧美视频| 欧美在线中文字幕| 亚洲视频网站在线观看| 播播国产欧美激情| 九九热精品视频在线播放| 中文字幕日韩精品在线| 精品伊人久久97| 中文字幕亚洲欧美在线| 欧美另类暴力丝袜| 97久久精品人人澡人人爽缅北| 国产成人欧美在线观看| 懂色av中文一区二区三区天美| 九九热r在线视频精品| 色综合老司机第九色激情| 国产97在线亚洲| 国产精品96久久久久久| 久久青草精品视频免费观看| 成人女保姆的销魂服务| 一区二区三区日韩在线| 亚洲自拍在线观看| 久久精品99久久久香蕉| 亚洲综合中文字幕68页| 中文字幕在线国产精品| 久久伊人免费视频| 91亚洲精品一区二区| 亚洲欧美国产精品| 精品国产一区二区三区久久| 亚洲精品wwww| 亚洲第一精品电影| 国产日韩欧美一二三区| 1769国内精品视频在线播放| 亚洲欧洲在线免费| 国产精品自拍偷拍| 国产精品高精视频免费| 久久影视电视剧免费网站清宫辞电视| 日韩精品中文字幕视频在线| 亚洲精品国产美女| 欧美成人精品激情在线观看| 欧美精品一区二区三区国产精品| 亚洲成人教育av| 亚洲va国产va天堂va久久| 精品国产福利视频| 欧美视频专区一二在线观看| 97国产精品人人爽人人做| 欧美高清性猛交| 2020久久国产精品| 中文字幕在线看视频国产欧美在线看完整| 55夜色66夜色国产精品视频| 欧美午夜影院在线视频| 国产精品毛片a∨一区二区三区|国| 97久久精品国产| 超碰91人人草人人干| 国产精品亚洲综合天堂夜夜| 亚洲色图25p| 久久久精品一区二区三区| 日韩视频在线一区| 大胆欧美人体视频| 久久久久久亚洲精品中文字幕| 国产亚洲一区二区在线| 亚洲国产美女久久久久| 国产精品高潮呻吟久久av黑人| 亚洲精品自产拍| 久久国产精品久久精品| 日韩综合中文字幕| 亚洲视频一区二区| 国产精品一区二区久久| 日韩av手机在线观看| 亚洲国产美女精品久久久久∴| 国产香蕉精品视频一区二区三区| 国产精品久久久久国产a级| 欧美性猛交xxxx乱大交3| 成人福利视频网| 色樱桃影院亚洲精品影院| 日韩av在线高清| 亚洲精品videossex少妇| 久久免费高清视频| 岛国av一区二区三区| 亚洲天堂男人天堂| 最新中文字幕亚洲| 亚洲第一福利在线观看| 岛国av一区二区在线在线观看| 亚洲人成网在线播放| 日韩极品精品视频免费观看| 国产suv精品一区二区三区88区| 精品久久久久久中文字幕一区奶水| 亚洲精品国精品久久99热| 久久久久久免费精品| 欧美在线视频一二三| 亚洲精品xxx| 国产欧美日韩中文| 中日韩美女免费视频网站在线观看| 欧美一区二区三区四区在线| 亚洲成色777777在线观看影院| 久久久久久久电影一区| 久精品免费视频| 日韩精品日韩在线观看| 欧美在线视频一区二区| 国产精品精品视频一区二区三区| 国产精品av免费在线观看|