2014-08-28 66 views
1

刪除字符串開頭和結尾空格的最有效方式是什麼,然後將字符串轉換爲零,如果結果值爲零長度?函數去掉!,然後將零長度字符串轉換爲零

例如:

> a='' 
> squash(a) 
=> nil 

> a=' ' 
> squash(a) 
=> nil 

> a=' xyz ' 
> squash(a) 
=> 'xyz' 

> a=nil 
> squash(a) 
=> nil 

迄今:

def squash(value) 

    return nil if value.nil? 

    value.strip! 

    (value.blank? ? nil : value) 

end 

看起來有可能實現這個的一個更簡潔的方式。

**編輯**

雖然我在Rails的我的工作,這將是很好,如果答案將包含一個Ruby中的實現,太。

我應該強調的是,執行需要能夠處理 的字符串,其值爲 nil

+0

你是什麼意思「沒有價值的字符串」?該字符串有一個嵌入式零?那你認爲是一個字符串實際上是零? – 2014-08-28 21:24:54

+0

點,@theTinMan。我希望函數能夠處理'nil'值而不會引發異常。 – craig 2014-08-29 04:56:15

回答

3

假設你想這對軌道(否則blank?是不確定的),你可以使用presence方法:

def squash(value) 
    value && value.strip.presence 
end 

在純Ruby,我會做:

def squash(value) 
    return unless value 
    value = value.strip 
    value unless value.empty? 
end 
+0

我不相信「存在」是Ruby。 – 2014-08-28 19:53:09

+0

@SteffenRoller - 它不是,但是因爲他叫'空白?'我認爲它是用於rails的。更新了答案。 – BroiSatse 2014-08-28 19:55:00

+0

我想是的。只是想說清楚。作爲腳本語言,我只在Ruby中使用Rails。因此,我經常感到很不高興,許多人甚至不知道其中的差別。 WRT你的迴應:我覺得它太棘手。恕我直言,它需要更多的時間來理解這裏的目的是什麼,而不是一個明確的「長度== 0」。運行時間差*應該可忽略不計。 – 2014-08-28 19:58:05

-1
 
irb(main):001:0> s = " string " 
=> " string " 
irb(main):002:0> s.strip! 
=> "string" 
irb(main):003:0> s.blank? 
NoMethodError: undefined method `blank?' for "string":String 
     from (irb):3 
     from C:/RUBY/BIN/irb:12:in `' 
irb(main):004:0> 

我覺得blank不是Ruby,而是Rails?無論如何,這有什麼錯

(value.length == 0 ? nil : value) 

甚至更​​好

value.empty? ? nil : value 

至少每個人都明白其意圖是在這裏。

+0

我想以'strip!'和'empty?'結合的方式來調用它們,不會引發'NoMethodError'異常,這將發生的字符串是'nil'。 – craig 2014-08-28 20:50:54

+1

那麼你可以做...'value.to_s.strip.empty? ? nil:value.strip' – SteveTurczyn 2014-08-28 21:42:07

2

這裏有一種方法:

def squash(str) 
    (str && str[/\S/]) ? str.strip : nil 
end 

/\S/查找的字符不是空白。

squash " My dog has fleas. " #=> "My dog has fleas." 
squash "     " #=> nil 
squash nil     #=> nil 

閱讀器挑戰

我試過,也能實現squash!,將參數str轉換到位。如果strnil,就讓它獨自一人。如果str包含至少一個非空白字符,則str.strip!。但是,我想不出一種方法來將字符串轉換爲nil。我想在字符串爲空或僅包含空白時執行此操作,但問題在於將對象作爲方法參數接收時,將任何字符串(或更一般地說,非零對象)轉換爲nil。可以做到嗎? [編輯: @Stefan表示類型不能改變。我相信他是對的,但我想看看這是寫在哪裏,並明白爲什麼不被允許。任何人? tidE]

+0

+1我喜歡它,但是如果nil通過,它不是工作。 – BroiSatse 2014-08-28 21:32:12

+0

謝謝,@BroiSatse。我沒有注意到最後一個例子。固定。 – 2014-08-28 21:47:00

+0

我喜歡「壓扁!」的想法。 – craig 2014-08-29 05:00:08

3

這將Ruby明文工作:

def squash(str) 
    str = str.to_s.strip 
    str unless str.empty? 
end 
1

這種處理所有你的例子。

def squash(value) 
    value.to_s.strip.empty? ? nil : value.strip 
end 
+0

史蒂夫,可讀性稍差,但可以將其縮短爲'value.strip,除非value.to_s.strip.empty?'。 – 2014-08-29 02:51:07

+0

@CarySwoveland yeeessss ...但下一個編碼器支持不能確定它是我的意圖還是錯字。 :) – SteveTurczyn 2014-08-29 05:20:05

+0

那麼,什麼?你是工作1太顯示其他編碼人員是多麼聰明。 – 2014-08-29 14:43:22

0

這裏有一個簡單的紅寶石版本:

def squash(str) 
    str && str.strip! && (str unless str.empty?) 
end 

更新 - 如果要沒有副作用的一個版本:

def squash(str) 
    str && (x = str.strip) && (x unless x.empty?) 
end 
+0

這裏有一個問題。返回正確的值,但如果s =「cat」和's'作爲參數傳遞,'s'就會改爲'「cat」',可能是OP想要的。但是,如果's =「」','s'保持不變。 – 2014-08-29 03:07:54

+0

@CarySwoveland這不會發生在我的機器上,w/ruby​​ 2.根據OP的規範,我得到'nil'。 – pjs 2014-08-29 12:30:02

+0

對不起,我的意思是如果's =「」','s'被轉換爲一個空字符串(不是「保持不變」),但我的觀點是站立的。如果s =「cat」',那麼'squash(s)=>「cat」','s =>「cat」'。爲了與此保持一致,我們希望''squash(s)=> nil','s => nil',但是我們在'squash(s)'之後得到's =>「 。 – 2014-08-29 14:35:18

1

只需添加這一點,因爲它的短:

def squash(str) 
    str.to_s[/\S(.*\S)?/] 
end 

squash(nil)   #=> nil 
squash("")   #=> nil 
squash(" ")   #=> nil 
squash("a")   #=> "a" 
squash(" a")  #=> "a" 
squash("a ")  #=> "a" 
squash(" a ")  #=> "a" 
squash(" foo ")  #=> "foo" 
squash(" foo bar ") #=> "foo bar" 
+0

不錯,@斯特凡,但13行是「短」? – 2014-08-29 14:47:28

相關問題