ruby中一些毫无意义的小细节

前言

ruby应该是我用的最久的一个语言了,无论是工作还是弄一些工具脚本,ruby的书写方式是我感觉最轻松最方便的,虽然语言本身和环境的问题,在国内用的人不多,但是也不能覆灭此语言 好玩 的特点。ruby语法简单,容易上手,很多有经验的人,看一天文档就可以直接进行项目的开发(rails),但是,简单归简单,ruby和其他语言一样,也有不少虽然天天再用,但是如果讲到一些细微的区别,往往也没几个人能完全说出来,对,包括我!这段内容其实没什么用


1. '"

简单一句话来说,就是一个自带转移,一个并没有是什么则是什么!

#使用 ""
word = "world" 
"Hello #{word}" #=>  Hello world

#使用 ''
'Hello #{word}' #=>  Hello /#{word}

上面就是区别,是不是感觉很没意义?我反正怎么觉得,但是当你的字符串中需要直接展示一些特殊字符时\n或者转义后uri时,这里的区别,可能一定程度上可以帮忙。因此在定义一般字符串内容的时候,建议使用'


2. pputs

首先最明显的区别是长度不一样!然后这两个输出的方式给人第一印象是前者是后者的简写。但是实际操作中,这两个方法有着一些本质区别: p 其实是返回对象的 inspect结果,而puts 则是返回对象的to_s结果。 由于p是调用的inspect,因此使用p时,会返回对象本身的状态。 而puts作为专门进行输出的method,在输出应该输出的内容后,只会返回nil


class Hello
    def inspect
      "word -> inspect"
    end
    def to_s
      "word -> to_s"
    end
end

hello = Hello.new #=> word -> inspect

p hello           #输出> word -> inspect
                  #返回> word -> inspect 
                  
puts hello        #输出> word -> inspect                    
                  #返回> nil


也因为这样的特性,在配合'"时,会输出一些一般情况下不会在意的东西:


    string1 = 'Hello \n Wrold'
    p string1 #输出> Hello \\n World
    puts string2 #输出> Hello \n World
    
    string2 = "Hello \n Wrold"
    p string2    #输出> Hello \n World
    puts string2 #输出> Hello
                 #输出> World

然后还有一个真正意义上的区别在于Array。 在使用 puts输出Array对象时,puts会对Array对象进行each操作并分别对每个Array对象执行to_s方法。


3. Rails相关,nil?empty?blank?present?区别

这几个方法,均是在判断对象状态时使用,ruby对于empty?blank?等针对不同的类型均进行了定义,因此为了方便说明,这里只考虑string类型的情况。

首先,nil? ,在正常情况下,只有对象是nil的时候才会返回true,没有例外,完。

接着empty?则更偏向于对于对象是否有大于0的长度作判断。

#此为官方文档示例,当采取使用File来读取文件时,读取的文件没有任何数据(可以视为读出的长度为0),那么empty?也将返回false!
"hello".empty?   #=> false
" ".empty?       #=> false
"".empty?        #=> true

然后是blank?,blank?方法其实一定程度上可以等同empty?,但是blank?对于empty?对传入的数据进行了一些处理后再进行判断,比如在String类型中,blank?会过滤掉空格符换行符(包含对应的转义符如: \r\n\t)。

"\r".empty? #=> false
"\r".blank? #=> true

最后是parsent?,说实话我从来不喜欢用这个方法,以至于拼写差点都不会,我宁可使用 unless obj.blank?,要问为什么的话:

  • 我用rails时貌似还没这个方法,习惯问题。。
  • 下面是parsent?的实现:
#非常符合OO编程规范
    def parsent?
        !blank?
    end    
    

评论