Ruby语言误区总结-入门级教程(二)

1、关于Ruby中的== === eql? equal?的区别

 

 

obj == other_obj  ->  true or false

在Object类层面,这个方法是判断obj和 other_obj是不是同一个对象(可以理解为两者的object_id一定要相同)。但通常子类都会重写 == 方法来加入自己的比较逻辑。虽然每个子类都对此有不同的实现,但常见的作用就是比较两个对象的值是否相同。

 

obj === other_obj  ->  true or false

主要用于case语句中的比较。效果和 == 一样,但一般会被子类重写,来适应case语句的需要。很典型的就是正则表达式的 === 方法。

 

obj.equal? (other_obj)  ->  true or false

判断obj和other_obj的object_id是否相同。子类不会重写这个方法。所以它的效果在任何对象中都是一样的

 

obj.eql? (other_obj)  ->  true or false

判断obj和other_obj的值是否相同。和 == 差不多,但有些细微区别,比如Numeric类型,1.eql?(1.0) 是返回 false 的,因为两者类型不同,而 == 则会做类型转换再比较。

 :

ary1 = %w{cat dog}  
ary2 = %w{cat dog}  
  
# 测试 ==  
ary1 == ary2     # true  
1 == 1.0         # true  
  
# 测试 equal?  
ary1.equal? ary2 # false  
1.equal? 1       # true  相同的整型数的object_id也相同,这点和Symbol类似  
  
# 测试eql?  
ary1.eql? ary2   # true  
1.eql? 1         # true  
1.eql? 1.0       # false  类型不同  
  
# 测试 ===  
/string/ == "string"  # false  
/string/ === "string" # true  为了case语句的比较而改写了Regexp的===方法  
  
Symbol.class_eval do  
  # 改写Symbol的===方法,使之可以等于相同“内容”的字符串  
  def ===(value)  
    value.is_a?(String) ? self.to_s == value : super  
  end  
end  
  
case "string"  
when :string # 这里就会调用:string === "string",成功匹配  
  true  
else  
  false  
end  
 

 

2、字符串索引的误区:

str = "abcdef"

p str[0]

这样打印出来的是97,因为直接索引字符串的结果是ASCI码,而不是字符本身,使用str[0].chr方法就可以取出字符来

 

 

3、Ruby中,变量前的两点 :x

这在汇编语言中比较常见,表示变量的字面值literal,:x在程序的编译期间保持不变,比如在hash中,为了变量不会变化,一般都会用"aaa" => :x这样的表达方式。

 

4、字符串的比较

Ruby中字符串比较不是先用size比较,而是从第一个字符开始比较ASCI。

 

比如: str1 = "dadaffafdg"

  str2 = "ioafdp"

比较的结果当然是str2>str1

 

5、字符串的运算方法-乘法

p "hello" * 3 

结果是打印hello三次,即hellohellohello

 

 

6、数组的索引,负数的情况

 s = ["1", 2, 39, 2, 12]

那么s[-1]是多少是12,因为负数索引时,最后一个元素是-1

你可能感兴趣的:(Ruby)