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中,变量前的两点 😡

这在汇编语言中比较常见,表示变量的字面值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语言误区总结-入门级教程(二)

相关文章:

你感兴趣的文章:

标签云: