2009-10-28 58 views
2
if step.include? "apples" or "banana" or "cheese" 
say "yay" 
end 
+0

您可以檢查自己通過獲取IDE,可以使用Ruby工作。 – KdgDev 2009-10-28 02:50:10

+0

當你不需要IDE時,不要浪費你的時間。 irb是檢查這種東西的正確方法。 – 2009-10-28 06:49:38

回答

6

你的代碼的幾個問題。

step.include? "apples" or "banana" or "cheese" 

該表達式的計算結果爲:

step.include?("apples") or ("banana") or ("cheese") 

由於Ruby對待比falsenil爲真以外的值,這個表達式永遠是正確的。 (在這種情況下,該值"banana"short-circuit的表達,導致其評估爲真,即使步長的值不包含任何這三個。)

你的意圖是:

step.include? "apples" or step.include? "banana" or step.include? "cheese" 

但是,這是低效的。它也使用or而不是||,它具有不同的運算符優先級,通常不應在if條件中使用。

普通or用法:

do_something or raise "Something went wrong." 

寫這更好的辦法將是:

step =~ /apples|banana|cheese/ 

這將使用regular expression,你打算在Ruby中使用了很多。

最後,還有在Ruby中沒有say方法,除非你定義一個。通常你會打電話給puts打印一些東西。

所以最終的代碼如下所示:

if step =~ /apples|banana|cheese/ 
    puts "yay" 
end 
+1

我是否添加了/ i不區分大小寫?這就像正則表達式? TY。 – gpwu 2009-10-28 02:52:17

+1

是的,這將是'step =〜/ /蘋果|香蕉|奶酪/我' – 2009-10-28 03:15:45

3

後兩個術語似乎對Ruby來說是真實的,而不是與include?短語有任何關係。

假設step是一個字符串...

step = "some long string with cheese in the middle" 

你可以寫這樣的事情。

puts "yay" if step.match(/apples|banana|cheese/) 
+0

如果它是在有條件的(像你這樣),你也可以這樣做:'把「耶」,如果步長=〜/蘋果|香蕉|奶酪/' – rfunduk 2009-10-28 02:47:56

+0

(對於那些不知道,因爲'把「耶」如果0 '會執行放入,但是'放入「yay」如果nil'不會) – rfunduk 2009-10-28 02:49:29

1

這絕對不是你想要的東西。 include?方法需要String,這不是"apples" or "banana" or "cheese"生成的。試試這個:

puts "yay" if ["apples", "banana", "cheese"].include?(step)

但目前還不清楚從應該哪一步是上下文。如果它只是單個單詞,那麼這很好。如果它可以是一個完整的句子,請嘗試joel.neely的答案。

2

這裏有一個方法來調用每個參數step.include?直到其中一個返回true

if ["apples", "banana", "cheese"].any? {|x| step.include? x} 
0

我會添加一些括號內爲您提供:

if (step.include? "apples") or ("banana") or ("cheese") 
    say "yay" 
end 

(這將是爲什麼它總是說「耶」 - 因爲表達將永遠是真的。)

1

最接近的事到語法,會做你看起來是想會是這樣的:

if ["apples", "banana", "cheese"].include?(step) 
    puts "yay" 
    end 

但其他建議之一使用正則表達式會更加簡潔和可讀。

-1

我想補充另一面,這...

如果stepArray(如呼叫include?似乎暗示),那麼也許代碼應該是:

if (step - %w{apples banana cheese}) != step 
    puts 'yay' 
end 
+1

最容易混淆和計算密集的變體。 – 2009-10-28 15:30:13

+0

我不知道有關混淆。這很愚蠢。就「計算密集型」......好吧,我並沒有將精力投入到高效的算法中,但它並沒有那麼糟糕。 – rfunduk 2009-10-29 00:55:33

1

假設step是一個ArraySet或別的東西,支持交集與&運營商,我認爲下面的代碼是最地道:

unless (step & ["apples","banana","cheese"]).empty? 
    puts 'yay' 
end