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