这篇文章是三个多月前写的,从原blog备份过来:
最近学ror。写篇小备忘,记录一个java程序员看ruby代码的时候最晕的部分:
1.方法的调用
ruby调用方法时,参数列表可以不用括号包裹(我一开始见到这种形式认为是变量定义...)。ruby是动态语言,定义变量的时候不需要(也不能)指定类型。
方法名 (空格) 参数1,参数2...
2.代码块(Blocks)、 do...end、yield、|x|
代码块(Blocks)是指一块代码,用大括号({})或者do...end来标明起始和结束,代码块只能跟在方法调用后边。
yield语句:在方法内部使用yield语句来占位,当方法执行到yield时,实际执行的是调用方法时跟在后边的的代码块。
|x|:变量用一对'|'包裹,在代码块中使用,用于接受yield传递的参数。yield后跟的参数会传递给代码块中用| |标志的变量。
常用法Iterator 。当初Blocks就是为了迭代而设置的
调用方法:
1
|
[
1
,
2
,
3
,
4
,
5
].
each
{ |i| puts i }
|
方法定义:
1
2
3
4
5
6
|
def
each
for
each
element
yield
(element)
end
end
|
3. 严格的命名约定(约定 而不是规范。强制执行)
ruby中由多个单词组成的符号,单词间用下划线分割(c风格)。方法名和变量名都是小写开头。变量的开头字符很多时候直接决定了变量类型。
局部变量以小写字母或下划线开始。
@开头:实例变量。$开头:全局变量。全局变量可以在程序的任何地方加以引用。全局变量无需变量声明。引用尚未初始化的全局变量时,其值为nil。
‘@@’开头:类变量。例如‘@@number’。和全局变量,实例变量不同,类变量在使用前必须初始化。
常量以大写字母开始。
4. unless: 除非
if的相反形式。相当于原if条件的else部分。
unless a>1 相当于 if a<=1 或者 if not a>1
5. hash、方法的hash参数
创建hash表的语法
1
2
3
|
h = {
"first"
=>
"Amy"
,
"second"
=>
"Mike"
,
"third"
=>
"Tom"
}
|
在方法中使用hash参数,可以不按照参数列表的顺序进行参数传递。可以通过传递key=>value形式的参数来同时指定参数名和参数值。
1
2
3
4
5
|
class
SongList
def
createSearch(name, params)
end
end
|
调用方式:
1
2
3
4
|
aList.createSearch(
"short jazz songs"
, {
'genre'
=>
"jazz"
,
'durationLessThan'
=>
270
} )
|
此方法中,第一个参数表示要搜索的名字,第二个参数是一个hash,存放所有要传的参数。但是这样的写法太"clunky"(沉闷?)了,在ruby
中,可以把包裹hash参数的大括号去掉。参数列表中所有hash形式的参数,会被收集成为一个hash参数进行传递。
1
2
3
4
|
aList.createSearch(
"short jazz songs"
,
'genre'
=>
"jazz"
,
'durationLessThan'
=>
270
)
|
6. symbol(冒号开头变量)
Symbol 表示“名字”,比如字符串的名字,标识符的名字。用':'(冒号)开头。在ruby中,每个 String对象都是不同的,即便他们包含了相同的字符串内容;而对于 Symbol 对象,一个名字(字符串内容)唯一确定一个 Symbol 对象。
字符串 "abc"
symbol :abc
symbol简单来说就是一个唯一的字符串,只要冒号后面的字符相同,就是同一个symbol。
每个symbol都有个字符串的名字(可以使用to_s方法得到)。而每个String可以请求它的相应symbol(通过to_sym方法)。String和Symbol是紧密相联的,但它们不是同一个东西,他们分别是String类和Symbol类的对象。
如果一个字符串具有名字的含义,比如表单的字段名;或者这个名字会被大量的重复使用,比如hash中的key,那么就应该使用symbol,而不是String。
symbol
可以大大提高速度。Symbol的内部表示是一个整数,用来做Hash表中检索字符串的关键字,而Ruby语言执行时解析器、运算器需要大量的类名字、方
法名字的检索,这可以大大加快解析和执行时字符串查找的速度。想想,如果没有Symbol,如果需要用方法名称作为参数时,我们必须给一个字符串用来表示
方法的名称,解释器处理时首先要作字符串解析,然后才能找到出相应的方法,而如果使用Symbol会大大加快这一速度。在使用中,Symbol往往表示一
个名字,例如一个变量foo的值为1,那么 :foo可以理解为变量名,如果直接引用foo,会得到1,但如果是 :foo就指变量名本身。
Symbol对象是唯一的。每次你在代码中使用:foo,Ruby保证系统中只有一个名字为foo的Symbol对象,所以所有对:foo的引用都将引用同一个对象。
7. < 和 <<
<是继承
<<表示某个对象的特殊类。用法如下:
1
2
3
4
5
6
7
|
obj2 = SingletonTest.
new
class
<< obj2
def
meth1
puts
"This is obj2's meth1"
end
end
|
8. 方法中最后一个表达式的值,就是方法的返回值。
也可以使用return语句。
你也可以使用return语句,这样方法的返回值就是return语句的参数。Ruby语言习惯省略return语句,能少写的尽量少写,这也是Ruby的哲学。
9. Defined?
Defined?用来判断表达式是否定义。若表达式尚未定义,则返回nil,若已经定义,则返回一个字符串描述该表达式的种类。
1
2
3
|
defined
? num =
0
defined
?
100
defined
?
100
.times
|
10.%w
%w用于生成字d 串数组,可以少写大量的引号和逗号
11.问号、叹号、等号结尾
! 叹号结尾说明此方法很危险,有副作用 传入参数会被修改
? 问号结尾说明这是一个查询方法, 通常是返回布尔值的方法
= 等号结尾说明此方法用于赋值
12.区间
Ruby区间存在于任何地方,如:1到12月。Ruby用区间实现了3个不同的特性:序列,条件,间隔。
"..":两个点号创建一个闭区间a..b——[a,b],"...":而三个点号创建一个右开区间(即右边界不取值)a...b——[a,b)
exp:0..anArray.length-1 等同于 0...anArray.length
to_a 把Ruby区间转换成列表
13. <=> 太空船操作符
太空船spaceship操作符<=>,比较两个值,并根据第一个值是否小于,等于或大于第二个值,分别返回-1,0或+1
分享到:
相关推荐
ruby初学笔记ruby初学笔记ruby初学笔记ruby初学笔记ruby初学笔记
ruby笔记1ruby笔记1ruby笔记1ruby笔记1ruby笔记1ruby笔记1
关于使用ruby对excel进行操作的内容,比较详细。
ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码
ruby基础笔记,自学笔记,ruby基础语法非常全面ruby基础笔记,自学笔记,ruby基础语法非常全面
ruby笔记3ruby笔记3ruby笔记3ruby笔记3ruby笔记3ruby笔记3
ruby笔记2ruby笔记2ruby笔记2ruby笔记2ruby笔记2
字符串,浮点数,布尔等基础数据类型,还有数组,哈希hash的用法, 类的定义,函数方法,以及对象定义,其他高级用法解释,除了笔记记录的语法糖之外,还包含了一些解释性的代码,帮助大家理解ruby的语法,...
ruby初学者必备,和java api一样,很强大。
中间的Io和prolog就被华丽丽的跳过了,因为prolog语法太奇葩,Io有没什么好的资料可以看,尽管我觉的Io应该会是一个强大的工具,而且语法超级简单。对象模型比起JavaScript好的不是一点两点,clone关键字真是为原型...
本文总结了一些Ruby的使用心得。使用Ruby最需要注意的一点就是效率:因为Ruby执行的效率本身比较慢,所以代码选择很重要。
ruby源代码 ruby源代码 ruby源代码 ruby源代码2
ruby源代码 ruby源代码 ruby源代码 ruby源代码4
——Ruby之父 松本行弘 本书为日本公认的最好的Ruby入门教程。 松本行弘亲自审校并作序推荐。 本书支持最新的Ruby 2.0, 也附带讲解了可运行于1.9版本的代码, 事无巨细且通 俗易懂地讲解了编写程序时所需要的变量...
ruby源代码 ruby源代码 ruby源代码 ruby源代码3
主要介绍了Ruby初学笔记之Hello World,本文是一篇Ruby自学笔记,本文分别用普通方法、函数、类输出Hello World,从一个一个的例子中了解Ruby编程,需要的朋友可以参考下
Ruby语言笔记包括简介、主要特性、命令行选项、环境变量、基础语法等
此时我对初学者一些总结
ruby源代码 ruby源代码 ruby源代码 ruby源代码5
ruby语法基础教程,学习ruby的入门教程。