侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Ruby基础知识之方法、代码段

技术  /  管理员 发布于 5年前   428

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中,方法一般小写字母开头,如果超过一个单词,则由下划线隔开(看习惯)。有意思的是方法名可以以等号、问号、叹号结尾,且有不同的意义:以等号(=)结尾表示这是一个赋值方法(写属性);以问号(?)结尾表示一个断言方法,可以回答调用者提出问题的值,例如判断大小;叹号(!)结尾表示是一个可变方法,可能会影响到对象的状态,要小心使用。这三个符号很有意思,但它们不是必须的。

(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方法中的值进行缓存。
(关于闭包,可以查看相关文档,我这里只是粗浅的认识。)


  • 上一条:
    php使用QueryList轻松采集js动态渲染页面方法
    下一条:
    vscode如何调试vue
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 2024/6/9最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 国外服务器实现api.openai.com反代nginx配置(0个评论)
    • 2024/4/28最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客