Ruby中的方法是一个有名称的代码块,是与一个或多个对象关联的参数化的代码。调用时须给出方法名,接收者(所在对象),参数值,且最后一个表达式的值做为返回值。与Ruby方法相似的是代码块,它没有名字,且调用时只通过迭代器或被间接调用。
(一)方法
(1)定义方法
定义方法就是
复制代码 代码如下:
def 方法名(参数列表)
方法体
end
最后一个表达式做为返回值返回,如果有值,则返回;无值则返回nil。可以省略return。
在类中定义的方法为实例方法,实例方法可以在类的实例对象上使用。如果是在一个特定的对象上定义方法,那么此方法就是一个单键方法,只能在这个对象上使用。
复制代码 代码如下:
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中,方法一般小写字母开头,如果超过一个单词,则由下划线隔开(看习惯)。有意思的是方法名可以以等号、问号、叹号结尾,且有不同的意义:以等号(=)结尾表示这是一个赋值方法(写属性);以问号("codetitle">复制代码 代码如下:
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方法中的值进行缓存。
(关于闭包,可以查看相关文档,我这里只是粗浅的认识。)
Ruby,基础知识,方法,代码段
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]