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
那些无法讲述的悲伤和苍凉,