Find file
Fetching contributors…
Cannot retrieve contributors at this time
executable file 85 lines (55 sloc) 2.98 KB
until false 将导致死循环。until true 循环停止。
10.times 是从0开始计数的——>0..9
t = ""
puts t.empty?
puts t.empty? ? "mafei" : "fff"
eql?与== 一样 :用于比较两个字符串是否相同,eql?方法不进行类型转换。
如: 1 == 1.0 #true
1.eql?1.0 #false
equal?方法由Object定义,用于测试两个值是否引用了同一个对象。对于两个不同的对象,该方法始终返回false。
chop方法会去掉字符串的最后一个字符,chomp(或chomp!)则从字符串中摘除行尾的记录分隔符(通常只是换行符)
require 根据搜索路径来查找特定的代码模块,并且保证不会重复载入给定的模块。
ruby解释器在退出之前会执行任何END语句,以及任何通过at_exit函数注册国的“关闭钩子(shutdown hook)”代码
Complex表示复数、BigDecimal表示任意精度的实数,使用的是十进制表示法而不是二进制表示法、Rarional表示有理数
ruby中两数相除时向负无穷大圆整,在取模时结果的符号始终和第二个操作数的符号保持
指数是按照从右到左计算的4**3**2的值与4**9相同,而不同于64**2
ruby遇见一个字符串字面量时,它都会新建一个对象;所以为了获得更好的运行效率,应避免在循环中使用字符串字面量。
ruby数组是无类型且可变的,数组里的元素不必都属于同一个类型,而且他们可以随时改变
hash = { a: "mafei", b: "nihao"}
等效于: hash = { :a => "mafei", :b => "nihao"}
如果新类里重写了eql?方法,那么必须同时重写hash方法,否则你的类实例将无法作为一个哈希键。
使用可变对象作为哈希键会带来一些问题:改变一个对象的内容通常会改变其哈希码,但是可以调用Hash类的rehash方法重新索引。字符串作为哈系键,Ruby会为其生存私有拷贝,然而这是唯一特例。
===操作符通常被称为“条件相等性(case equality)”操作符
1 <=> 5 # -1
5 <=> 5 # 0
9 <=> 5 # 1
"1" <=> 2 # nil
freeze将对象冻结之后,就没有办法解冻该对象了。
dup拷贝一个冻结对象,那么得到的副本将不是被动冻结的。
clone拷贝的被冻结对象,得到的副本也是被冻结的。
用户输入——比如命令行参数、环境变量及用gets方法读入的字符串——都会自动地称为受污染的。
由clone和dup方法得到的受污染的副本也是受污染的。一个受污染的对象可以通过untaint方法成为未受污染的(untainted)
__FILE__ 表示ruby解释器正在执行的文件名称。
__LINE__ 表示当前代码的行数,该代码属于__FILE__所代表的文件。
Ruby将布尔操作符内建于语言当中,而不是基于方法,比如,类不能定义它们自己的&&方法。
flip-flop
(1..10).each { |x| print x if x==3..x>=3 } #Prints "3"
(1...10).each { |x| print x if x==3...x>=3 } #Prints "34"
?:操作优先级很低且是右结合的.
当while和until作为单个Ruby表达式的修饰符时,虽然循环条件出现在循环体之后,但还是会先测试循环条件。
x = 10
begin
puts x
x = x - 1
end until x == 0
注意,如果用圆括号将多个语句组合起来,并且后接一个until修饰符,那么就不会发生上述的特殊行为。
一个for循环的循环变量(或变量组)并不是该循环的局部变量,在对应的循环退出后,它们仍然具有定义。类似地,在循环体中定义的信变量也能在循环结束后继续存在。
循环的for版本和each版本之间的唯一差别在于,跟在一个迭代器后面的代码块会定义一个信的变量作用域。
n.times与0.upto(n-1)等价
从0开始以0.1为步长进行迭代,知道Math::PI为止
0.step(Math::PI,0.1) {|x| puts x}
for循环只能作用于那些具有each方法的对象。
File.open(filename) do |f|
f.each {|line| print line}
end
最后会自动关闭文件