继续上次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更像是嵌入了一个代码块,如果返回就相当于跳出了原函数。

[Rails学习之路]初识Ruby(二)的更多相关文章

  1. [Rails学习之路]初识Ruby(一)

    Ruby是一门动态的.强类型的.纯面向对象的编程语言.它和Python非常相似,但比Python面向对象更加彻底.使用更加灵活.语法更加复杂.也更为有趣. 抛开做事情到底应该有多少种方法这个问题,我相 ...

  2. WPF学习之路初识

    WPF学习之路初识   WPF 介绍 .NET Framework 4 .NET Framework 3.5 .NET Framework 3.0 Windows Presentation Found ...

  3. 开始了大概三四天的Rails学习之路

    最近因为一位极光推送朋友,我开始了大概三四天的Rails学习之路,最终达到的水平是可以比较轻松地做出大部分功能,然后自我感觉可以自如地按照Rails的设计思想去思考.由于编程的日益流行,我结识了越来越 ...

  4. FastAPI 学习之路(十二)接口几个额外信息和额外数据类型

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  5. [Rails学习之路]Rails文件结构与路由

    约定优于配置和RESTful是Ruby on Rails十分推崇的哲学.在一个默认的RESTful的Rails项目中,使用资源和HTTP动词来帮助组织项目. 假如有一个使用scaffold创建的Rai ...

  6. #Java学习之路——基础阶段二(第三篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...

  7. #Java学习之路——基础阶段二(第一篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...

  8. #Java学习之路——基础阶段二(第十篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...

  9. 学习之路三十二:VS调试的简单技巧

    这段时间园子里讲了一些关于VS的快捷键以及一些配置技巧,挺好的,大家一起学习,一起进步. 这段时间重点看了一下关于VS调试技巧方面的书,在此记录一下学习的内容吧,主要还是一些比较浅显的知识. 1. 调 ...

随机推荐

  1. 远程桌面连接KVM虚拟机

    问题描述 有些时候,由于网络存在问题,虚拟机无法获取到IP地址,无法使用spice或vnc来连接虚拟机,但是又需要连到虚拟机来排查故障 解决办法 编辑虚拟机配置 设置xml命名空间 <domai ...

  2. 如何在MySQL中设置外键约束

    引用:http://blog.sina.com.cn/s/blog_53729e4601011wja.html MySql外键设置详解   (1) 外键的使用: 外键的作用,主要有两个:    一个是 ...

  3. 百度AI图片识别

    官方文档:http://ai.baidu.com/tech/ocr/general

  4. CodeForces 118C 【模拟】

    思路: 枚举0-9之间的数,然后判断. 然后一鼓作气打成了大模拟....我日啊... 心疼自己. #include <bits/stdc++.h> using namespace std; ...

  5. 51nod1024(math+set)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1024 题意:中文题诶- 思路:要是能求出a^b的值来就好了. ...

  6. 清北刷题冲刺 10-29 a.m

    遭遇 /* 因为选的楼是个集合,与顺序无关 而且总花费=c[1]+c[2]+c[3]+|h[1]-h[2]|+|h[2]-h[3]| 我们规定走的顺序从高到低,那么绝对值就可以去掉 所以就可以约掉中间 ...

  7. PHP-CGI远程任意代码执行漏洞(CVE-2012-1823)修复方案

    首先介绍一下这个漏洞,其实是在apache调用php解释器解释.php文件时,会将url参数传我给php解释器,如果在url后加传命令行开关(例如-s.-d .-c或  -dauto_prepend_ ...

  8. MD5WLBUtil

    import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; import j ...

  9. 有效使用Mock编写java单元测试

    Java单元测试对于开发人员质量保证至关重要,尤其当面对一团乱码的遗留代码时,没有高覆盖率的单元测试做保障,没人敢轻易对代码进行重构.然而单元测试的编写也不是一件容易的事情,除非使用TDD方式,否则编 ...

  10. object.wait为什么要和synchronized一块使用

    Object.wait 中JDK提供的doc文档 Causes the current thread to wait until another thread invokes the notify() ...