ruby基础(二)
ruby语法基础
1.方法
方法时对象定义的与该对象相关的操作。在Ruby中,对象的所有的操作都被封装成
方法。
语法糖:语法糖是一种为了照顾一般人的习惯而产生的特殊语法。
ruby中一切数据都是对象,那么加法运算应该写成3.add(2).但是一般人更
习惯于2+2.这便时一种语法糖。
方法的调用
对象.方法名(参数1,参数2,...)
带块的方法的调用
对象.方法名(参数,...) do |变量1,变量2,...|
块内容
end
eg:each方法
(0..10).each do |i|
puts i #1 .... 10
if i==5 then
break
end
end
其中i被称作块块变量,不同的方法的块变量个数不同。
运算符方法
ruby中有些方法看起来像运算符
obj + arg1
obj[arg1]=arg2
其中的obj为调用方法的对象,arg1、arg2理解为参数
方法的分类
Ruby的方法可以分为三类:
- 实例方法
- 类方法
- 函数式方法
实例方法
方法的调用者是一个对象
eg:
p "ads".eql?"sdsa"
类方法
方法的调用者时类
eg:
File.open "hello.txt"
Ruby中调用类方法还可以使用“::”代替“.”。
函数式方法
没有调用对象的方法称为函数时方法,eg:
p "hello"
puts "aaa"
Ruby帮助文档中方法的标记方法
方法 | 标记法 | eg |
---|---|---|
实例方法 | 类名#方法名 | Array#each、Array#inject |
类方法 | 类名.方法名或类名::方法名 | Array.new或者Array::new |
ruby中方法的定义
语法:
def 方法名 (参数1,参数2,...)
希望执行的处理
end
eg:定义一个方法,接受用户名作为参数,打印hello,用户名
def hello(name)
puts "hello,#{name}!"
end
hello('ruby') #hello,ruby!
给方法指定默认值
def hello(name="python")
puts "hello,#{name}!"
end
hello('ruby') #hello,ruby!
#使用默认参数调用方法
hello() #hello,python!
当有个多个参数时,指定默认值的参数只能放在最后面。
def cal(a,b=1,c=2)
puts a+b+c
end
cal(1) #=>4
cal(1,2) #=>5
cal(1,2,3) #=>6
方法的返回值
使用return方法指定返回值
def volume(x,y,z)
return x*y*z;
end
省略return语句时,使用最后方法的最后一条执行语句的执行的执行结果作为返回值。
def volume(x,y,z)
x*y*z;
end
p volume(1,2,3) #=>6
使用return语句提前终止方法的执行
def volume(x,y,z)
if x=0
puts "x不能为0"
return;
end
x*y*z;
end
p volume(0,2,3) #=>nil
省略return的参数,返回值为nil.
定义带块的方法
使用yield定义代块的方法
eg:定义一个myloop方法,实现loop的效果。
def myloop
while true
yield #执行块
end
end
num=1
myloop do
puts "hello"
if(num>10)
break
end
num*=2
end
参数个数不确定的方法
使用“*变量”的形式来定义参数个数不确定的方法,以数组的形式传入参数
def foo(*args)
args
end
p foo(1,2,3) #=>[1,2,3]
“*变量名”这种形式的参数只能在参数列表中出现一次。位置可以时开始、中间
、结束
def foo(b,*args,a)
puts a+b #=>5
args
end
p foo(1,2,3,4) #=>[2,3]
关键字参数
关键字参数名和参数值成对的传入方法内部使用。从而可以忽略参数的顺序.
当不传入关键字参数,还可以使用定义函数的时的默认值作为参数。
def 方法名 (参数1:值1,参数2:值2,...)
希望执行的处理
end
eg:
def volune(x:1,y:2,z:3)
x*y*z
end
p volune(x:1,y:2,z:3) #6
p volune(z:3,y:2,x:1) #6
p volune(x:2) #12
如何不需要指定默认值,可以使用“参数名:”,这样调用的时候必须传入参数
def volune(x:,y:2,z:3)
x*y*z
end
p volune(x:1,y:2,z:3) #6
p volune(y:2,z:3) #error
使用"**变量"收集未定义的参数(以散列的形式保存),
def volune(x:1,y:2,z:3,**args)
puts args #{:a=>1, :b=>2}
x*y*z
end
p volune(x:1,y:2,z:3,a:1,b:2) #6
关键字参数和普通的参数搭配使用
def func(a,b:1,c:2)
~~
end
func(1,b:2,c:3)
用散列传递参数
可以把散列作为个关键字参数传给方法。此时散列的健只能用符号,可以省略
定义了默认值的关键字参数,但是不能传递多余的参数。
def volune(x:1,y:2,z:3)
x*y*z
end
args1={x:1,y:2,z:3}
p volune args1 #6
args2={x:1,y:2}
p volune args2 #6
args3={x:1,y:2,z:3,a:4}
p volune args3 #error
把数组分解为参数,使用*数组分解参数,但是数组参数的个数要和方法的一致
def foo(a,b,c)
a+b+c
end
p foo(1,2,3)
args1=[2,3]
p foo(1,*args1)
args2=[1,2,3]
p foo *args2
散列作为普通参数传递给方法时,如果是最后一个参数可以省略{}.
def foo(a,hash)
puts hash
end
foo(1,{a:1,b:1})
foo(1,a:1,b:1)
ruby基础(二)的更多相关文章
- Ruby语法基础(二)
Ruby语法基础(二) 继续ruby的学习,这次主要把目光放到运算符,条件判断,循环,方法,以及其他ruby特有的基本概念上 运算符 算术运算符:+,-,/,%,**,值的注意的是,ruby中一切皆为 ...
- Python全栈开发【基础二】
Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...
- Bootstrap <基础二十九>面板(Panels)
Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...
- Bootstrap <基础二十八>列表组
列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...
- Bootstrap<基础二十七> 多媒体对象(Media Object)
Bootstrap 中的多媒体对象(Media Object).这些抽象的对象样式用于创建各种类型的组件(比如:博客评论),我们可以在组件中使用图文混排,图像可以左对齐或者右对齐.媒体对象可以用更少的 ...
- Bootstrap <基础二十六>进度条
Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...
- Bootstrap <基础二十五>警告(Alerts)
警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...
- Bootstrap<基础二十四> 缩略图
Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ...
- Bootstrap <基础二十三>页面标题(Page Header)
页面标题(Page Header)是个不错的功能,它会在网页标题四周添加适当的间距.当一个网页中有多个标题且每个标题之间需要添加一定的间距时,页面标题这个功能就显得特别有用.如需使用页面标题(Page ...
随机推荐
- 前端 | vxe-table 翻页保留复选框状态
0 前言 在前端开发过程中时常会遇到表格相关的显示与处理.组件库通常都会提供表格组件,对于展示.简单操作这些常用功能通常也够用:但如果需要更多的定制或进行比较复杂的操作,组件库自带的组件可能会捉襟见肘 ...
- Golang 基于Prometheus Node_Exporter 开发自定义脚本监控
Golang 基于Prometheus Node_Exporter 开发自定义脚本监控 公司是今年决定将一些传统应用从虚拟机上迁移到Kubernetes上的,项目多而乱,所以迁移工作进展缓慢,为了建立 ...
- 全网最详细的Linux命令系列-nl命令
nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...
- 移动文件--mv
mv file srcpath 将文件移动到指定目录下 mv dir srcpath 将文件移动到指定目录下
- A. 1.划分数列
A . 1. 划 分 数 列 A. 1.划分数列 A.1.划分数列 氵水沝淼㵘解析 先预处理,然后公式推(详见代码) Code #include <bits/stdc++.h> using ...
- OO第四单元作业总结以及课程总结
第四单元总结--UML 第四单元作业架构分析 第一次作业其实是本单元三次作业中最难的一次.由于第一次是第一次作业,要考虑到搭建框架和设计架构,这次作业的思维性很强.在了解了各个类型元素(Element ...
- IDEA/JRebel实现内部/外部/远程Tomcat热部署Spring Boot
1 概述 所谓热部署,对于Java应用程序来说,就是在运行时更新Java类文件.IDEA可以使用自带的Spring Boot热部署的方式进行本地/远程热部署,或者使用JRebel进行本地/远程热部署, ...
- Day05_23_封装
封装 什么是封装? 封装可以被认为是一个类的保护屏障,防止该类的代码和数据被外部类定义的代码随机访问.要访问该类的代码和数据,必须通过严格的接口控制.封装最主要的功能在于我们能修改自己的实现代 码,而 ...
- k8s job 控制器
Job控制器可以执行3种类型的任务 1)一次性任务 2)串式任务 spec.completions 3)并形式任务 spec.parallelism 默认Job执行后,不会自动删除,需要手动删除,例如 ...
- 阿里云 RTC QoS 弱网对抗之 LTR 及其硬件解码支持
LTR 弱网对抗由于需要解码器的反馈,因此用硬件解码器实现时需要做一些特殊处理.另外,一些硬件解码器对 LTR 的实现不是特别完善,会导致出现解码错误.本文为 QoS 弱网优化系列的第三篇,将为您详解 ...