[Rails学习之路]初识Ruby(二)
继续上次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(二)的更多相关文章
- [Rails学习之路]初识Ruby(一)
Ruby是一门动态的.强类型的.纯面向对象的编程语言.它和Python非常相似,但比Python面向对象更加彻底.使用更加灵活.语法更加复杂.也更为有趣. 抛开做事情到底应该有多少种方法这个问题,我相 ...
- WPF学习之路初识
WPF学习之路初识 WPF 介绍 .NET Framework 4 .NET Framework 3.5 .NET Framework 3.0 Windows Presentation Found ...
- 开始了大概三四天的Rails学习之路
最近因为一位极光推送朋友,我开始了大概三四天的Rails学习之路,最终达到的水平是可以比较轻松地做出大部分功能,然后自我感觉可以自如地按照Rails的设计思想去思考.由于编程的日益流行,我结识了越来越 ...
- FastAPI 学习之路(十二)接口几个额外信息和额外数据类型
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- [Rails学习之路]Rails文件结构与路由
约定优于配置和RESTful是Ruby on Rails十分推崇的哲学.在一个默认的RESTful的Rails项目中,使用资源和HTTP动词来帮助组织项目. 假如有一个使用scaffold创建的Rai ...
- #Java学习之路——基础阶段二(第三篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- #Java学习之路——基础阶段二(第一篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- #Java学习之路——基础阶段二(第十篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- 学习之路三十二:VS调试的简单技巧
这段时间园子里讲了一些关于VS的快捷键以及一些配置技巧,挺好的,大家一起学习,一起进步. 这段时间重点看了一下关于VS调试技巧方面的书,在此记录一下学习的内容吧,主要还是一些比较浅显的知识. 1. 调 ...
随机推荐
- 聚类算法(二)--BIRCH
BIRCH (balanced iterative reducing and clustering using hierarchies)(名字太长不用管了) 无监督,适合大样本的聚类方法.大多数情况只 ...
- Libvirt代码架构
Libvirt介绍 参考资料 Libvirt学习 通过virsh了解libvirt api的调用方式 通过virHypervisorDriver了解libvirt api的实现 virsh代码阅读 通 ...
- 开发外包注意事项二——iOS APP的开发
目前我的方式是按时间算. 首先这得建立在双方的信任基础上. 以我做过的Case为例: 首先会和客户一起评估需求: 1. 哪些功能是最为重要的 2. 哪些功能是可以删除的 3. 用什么策略保证APP的出 ...
- jsp 文件上传操作
文件上传 1:完成一个文件上传的功能 index.jsp 注意更换form表单的enctype enctype就是encodetype就是编码类型的意思. multipart/form-data是指表 ...
- php使用百度地图API
首先注册百度开发者平台账号,创建应用获取AK 不同的应用功能不同,一定要注意,没有的功能调用会提示APP被禁用 根据开发文档使用 给出例子:百度地图WEB api http://lbsyun.baid ...
- element-ui国际化探索(大型项目适用)
配置好了,自己感觉是比较简单的,就是有一点点繁琐,加油吧. 由于保密,无法拿出项目,故写了一个小demo,记录一下,适用于大型项目: 项目中需要自定义切换中/英文(国际化),基于vue.js,结合vu ...
- Angular学习笔记 ——input 标签上的【name属性】和【ngModelOptions属性】
利用“@angular/forms" 创建<form>表单的时候,系统默认会创建一个”FormGroup"的对象. 使用带有“ngModel"的”<in ...
- web.xml中监听器如何顺序加载
最近用到在Tomcat服务器启动时自动加载数据到缓存,这就需要创建一个自定义的缓存监听器并实现ServletContextListener接口, 并且在此自定义监听器中需要用到Spring的依赖注入功 ...
- Java匹马行天下之JavaWeb核心技术——JSP
JSP动态网页技术 一.JavaWeb简介 一.什么是JavaWeb? JavaWeb是用Java技术来解决相关web互联网领域的技术总称. 需要在特定的web服务器上运行,分为web服务器和web客 ...
- CentOS7.4搭建GitLab
1.查看服务器环境 uname -a 2.下载安装包 [1]找到相应的最新版本的下载路径 网址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/e ...