字符串

2018-02-24 16:10 更新
  • 盡量使用字符串插值(interpolation),而不是字符串連接(concatenation)。

    # 差
    email_with_name = user.name + ' <' + user.email + '>'
    
    # 好
    email_with_name = "#{user.name} <#{user.email}>"
  • 對(duì)于插值表達(dá)式, 括號(hào)內(nèi)不應(yīng)有留白(padded-spacing)。

    # 差
    "From: #{ user.first_name }, #{ user.last_name }"
    
    # 好
    "From: #{user.first_name}, #{user.last_name}"
  • 選定一個(gè)字符串字面量創(chuàng)建的風(fēng)格。Ruby 社區(qū)認(rèn)可兩種分割,默認(rèn)用單引號(hào)(風(fēng)格 A)和默認(rèn)用雙引號(hào)(風(fēng)格 B)

    • (風(fēng)格 A)當(dāng)你不需要插入特殊符號(hào)如?\t,?\n,?', 等等時(shí),盡量使用單引號(hào)的字符串。

      # 差
      name = "Bozhidar"
      
      # 好
      name = 'Bozhidar'
    • (風(fēng)格 B)?用雙引號(hào)。除非字符串中含有雙引號(hào),或者含有你希望抑制的逃逸字符。

      # 差
      name = 'Bozhidar'
      
      # 好
      name = "Bozhidar"

    有爭(zhēng)議的是,第二種風(fēng)格在 Ruby 社區(qū)里更受歡迎一些。但是本指南中字符串采用第一種風(fēng)格。

  • 不要用??x。從 Ruby 1.9 開始,??x?和?'x'?是等價(jià)的(只包括一個(gè)字符的字符串)。

    # 差
    char = ?c
    
    # 好
    char = 'c'
  • 別忘了使用?{}?來(lái)圍繞被插入字符串的實(shí)例與全局變量。

    class Person
      attr_reader :first_name, :last_name
    
      def initialize(first_name, last_name)
        @first_name = first_name
        @last_name = last_name
      end
    
      # 差 - 有效,但難看
      def to_s
        "#@first_name #@last_name"
      end
    
      # 好
      def to_s
        "#{@first_name} #{@last_name}"
      end
    end
    
    $global = 0
    # 差
    puts "$global = #$global"
    
    # 好
    puts "$global = #{$global}"
  • 字符串插值不要用?Object#to_s?。Ruby 默認(rèn)會(huì)調(diào)用該方法。

    # 差
    message = "This is the #{result.to_s}."
    
    # 好
    message = "This is the #{result}."
  • 當(dāng)你需要建構(gòu)龐大的數(shù)據(jù)塊(chunk)時(shí),避免使用?String#+?。 使用?String#<<?來(lái)替代。<<?就地改變字符串實(shí)例,因此比?String#+?來(lái)得快。String#+?創(chuàng)造了一堆新的字符串對(duì)象。

      # 好也比較快
      html = ''
      html << '<h1>Page title</h1>'
    
      paragraphs.each do |paragraph|
        html << "<p>#{paragraph}</p>"
      end
  • 當(dāng)你可以選擇更快速、更專門的替代方法時(shí),不要使用?String#gsub

    url = 'http://example.com'
    str = 'lisp-case-rules'
    
    # 差
    url.gsub("http://", "https://")
    str.gsub("-", "_")
    
    # 好
    url.sub("http://", "https://")
    str.tr("-", "_")
  • heredocs 中的多行文字會(huì)保留前綴空白。因此做好如何縮進(jìn)的規(guī)劃。

    code = <<-END.gsub(/^\s+\|/, '')
      |def test
      |  some_method
      |  other_method
      |end
    END
    #=> "def\n  some_method\n  \nother_method\nend"
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)