继续上次Ruby的学习。接下来就到了Ruby的方法。

Ruby的方法与Python仍然很像。使用def定义,可以使用undef取消定义。

在Ruby中,经常可以看见方法后面跟有“?”或“!”。这其实是方法名的一部分。

带有“?”表示返回一个布尔值;带有“!”表示方法会修改对象自身。

以Array类为例:

  • empty?返回数组是否为空。相当于isEmpty
  • sort!表示会对数组原地排序。
  • sort则返回一个排好序的副本,自身不会改变。

Ruby的方法可以无参数,有多个参数,甚至可变数量的参数。

  • 方法如果没有参数可以不带括号。

  • 方法中的参数给定缺省值。

  • 对于多个参数,不支持Python式的指定参数,但可以借助字典实现。

    method('a'=>1, 'b'=>2)
  • 可变参数与Python类似。

    def sum(*num)
    result = 0
    num.each {|i| result += i}
    return result
    end

因为Ruby中变量不表示类型,而且又支持缺省参数,所以方法不支持重载。但是支持重写。

方法的返回值为return表达式的值,或者为最后一条语句的值。如果return不带参数,则返回nil;如果有多个参数,则返回一个数组。

Ruby还有一个有趣的东西叫做block。虽然有传统的for循环,但Ruby更常用的是each循环,这里就用到了block。

block有这么几种使用形式:

def method
yield
end def method(&p)
p.call
end method { puts "Hello" }

这里的&p是什么?p表示的是一个Poroc对象。Proc表示Procedure。&表示将Proc对象转换为block。Proc和block的主要区别在于Proc对象可以保存,重复使用,而block不能。如果需要再次使用,可以用Proc.new()proc()将block转换成Proc对象。

还有一个与block很相似的lambda表达式。它的样子像这样:

lambda {|x| puts x}

长得虽像,但lambda是匿名函数,block是代码块。

所以它和block主要有两个区别:

  • lambda会检查参数个数,而block不会。
  • lambda因为是函数,所以调用时是函数调用,返回时回到原函数;而block更像是嵌入了一个代码块,如果返回就相当于跳出了原函数。

最新文章

  1. .Net 分布式云平台基础服务建设说明概要
  2. Matlab 读取文件夹中所有的bmp文件
  3. try-catch和throw,throws的区别
  4. mysql数据类型最大长度记录
  5. Linux下 Unison 实现文件双向同步
  6. CentOS时钟同步服务器
  7. L​i​n​u​x​下​配​置​T​o​m​c​a​t
  8. C#之DirectoryInfo操作
  9. 零基础如何自学java开发?
  10. Python开发【第十六篇】:AJAX全套(转)
  11. JavaScript大师必须掌握的12个知识点
  12. (转)Android 之生成图形验证码
  13. 静默安装Oracle12.2数据库
  14. SCOI 2015 Day1 简要题解
  15. JDK源码之ArrayList
  16. [转] webpack热更新配置小结
  17. jmeter源码导入eclipse并完成编译
  18. Leetcode 1004. 最大连续1的个数 III
  19. Jshell使用
  20. lnmp “.user.ini”无法删除解决方法

热门文章

  1. CODING 告诉你硅谷的研发项目管理之道(4)
  2. MCP|LDY|Mass Spectrometry-based Absolute Quantification of 20S Proteasome Status for Controlled Ex-vivo Expansion of Human Adipose-derived Mesenchymal Stromal/Stem Cells(基于质谱技术的20S蛋白酶体绝对定量方法监控人体脂肪...
  3. 为CentOS下的Docker安装配置python3【转】
  4. [转]SE43 修改SAP标准菜单、登陆界面、背景图片
  5. Objective-C的Runtime System
  6. thinkphp5控制器访问转换问题
  7. 消息中间件 | 消息协议 | MQTT3.1.1 -- 《分布式 消息中间件实践》笔记
  8. LeetCode初级算法(其他篇)
  9. HDU 5773 The All-purpose Zero 脑洞LIS
  10. 3 - EventLoop和线程模型-事件循环