2012-09-14 64 views
23

我在Ruby中有一個字符串,我在其中調用strip方法來刪除前導和尾隨空格。例如在調用方法之前Ruby檢查是否爲

s = "12345 " 
s.strip 

但是,如果字符串爲空,我會得到以下錯誤。

NoMethodError:未定義的方法`條」的零:NilClass

我使用Ruby 1.9有啥最簡單的檢查方式,如果該值是零調用條法過嗎?

更新:

我想這在數組中的元素,但得到了同樣的問題:

data[2][1][6].nil? ? data[2][1][6] : data[2][1][6].split(":")[1].strip 
+1

這已被問及幾十次:http://stackoverflow.com/questions/5429790/is-there-a-clean-way-to-avoid-calling-a-method-on- nil-in-a-nested-params-hash – tokland

+1

注意原始海報:字符串不是空的,因爲你聲稱,這將是's =「」',它是零。它還不存在。如果它是空的,你可以檢查:'s.strip,除非s.empty?' – three

+1

如果字符串是空的,你不會得到那個錯誤。 – sawa

回答

0

簡單地說:

s = s.nil? ? s : s.strip 

文藝青年最愛的檢查如果s是零,然後返回s,否則,剝離它。

+0

@lukad比這個更簡單的答案即使。 – Eugene

+0

謝謝 - 剛剛嘗試過一個數組中的元素與拆分結合。它似乎仍然失敗: 。 puts數據[2] [1] [6] .nil? ? data [2] [1] [6]:data [2] [1] [6] .split(「:」)[1] .strip 。 NoMethodError:未定義方法'strip'for nil:NilClass – user1513388

+0

'data [2] [1] [6] .split(「:」)'return?似乎它只有一個項目。 – lukad

4

我想最簡單的方法是如下:

s.strip if s 
+2

如果你試圖鏈接的東西不是很方便。 –

+0

需要的是一種普遍的說法,「如果我在nil上調用一個方法,只是返回零」,所以我們不必用這些東西來混淆我們的代碼。 IOW,我們需要「腳本語言」功能。也許可以在開發級別向控制檯投擲某些東西,只是爲了在出現意外的情況下幫助解決問題。 – JosephK

+0

@JosephK查看Jessie Sielaff的回答。你在找什麼是在Ruby 2.3中添加的。它被稱爲_safe導航操作符_。 – lukad

1

法這對我來說(我知道,我不應該污染原始Object空間,但它是如此方便,我會承擔風險)的工作原理:

class Object 
    def unless_nil(default = nil, &block) 
    nil? ? default : block[self] 
    end 
end 

p "123".unless_nil(&:length) #=> 3 
p nil.unless_nil("-", &:length) #=> "-" 

在您的特定情況下,它可能是:

data[2][1][6].unless_nil { |x| x.split(":")[1].unless_nil(&:strip) }

12

您可以使用方法try從的ActiveSupport(Rails的庫)

gem install activesupport 

require 'active_support/core_ext/object/try' 
s.try(:strip) 

,或者你可以用我的寶石tryit這使額外的設施:

gem install tryit 

s.try { strip } 
2

ActiveSupport附帶了一個方法:try。例如,如果an_object爲零,則an_object.try :strip將返回nil,但將以其他方式進行。語法與send相同。 Cf active_support_core_extensions.html#try

1

如果你想避免在出現問題的錯誤:

s.to_s.strip 
8

如果你不介意額外的對象被創建,這兩種工作:

"#{s}".strip 
s.to_s.strip 

無需額外object:

s && s.strip 
s.strip if s 
47

ruby​​ 2.3.0新增了a 安全導航操作員&.)在調用方法之前檢查nil。

s&.strip 

它將返回nil如果snil,而不是提高NoMethodError

+0

是的 - 這是讓Ruby變得像一個正確的網頁腳本語言的唯一方法。如果只有一種方法可以對所有出現這種惱人和無用的行爲的情況進行全局設置 - 並且在需要的時候(比如puts語句)默認地將所有值隱式轉換爲字符串。 – JosephK

+1

我第一次看到這個 - 超級有用 – Yarin

相關問題