2014-11-14 412 views
3

我正在使用rspec示例測試測試第一個Ruby ...如何在Ruby中刪除數組中的引號

我需要通過此測試。

it "tokenizes a string" do 
    calculator.tokens("1 2 3 * + 4 5 - /").should == 
     [1, 2, 3, :*, :+, 4, 5, :-, :/] 
    end 

這裏是我的代碼

def tokens(str) 
    data = str.split(' ') 
    outcomes = [] 
    data.collect do |x| 
     if x.to_i != 0 
     outcomes.push(x.to_i) 
     elsif x.to_i == 0 
     temp = x.gsub('"', '') 
     outcomes.push(":#{temp}") 
     end 
    end 
    outcomes 
    end 

但是,我得到這些反饋。不知道如何擺脫引號。

Failure/Error: [1, 2, 3, :*, :+, 4, 5, :-, :/]                                
     expected: [1, 2, 3, :*, :+, 4, 5, :-, :/]                                 
      got: [1, 2, 3, ":*", ":+", 4, 5, ":-", ":/"] (using ==) 
+3

順便說一句,你的代碼有一個錯誤:你不能輸入'0'。 –

回答

3

試試這個:

outcomes.push(:"#{temp}") 

":#{temp}"是字符串,但這個:"#{temp}"符號用繩子interpo特徵研。

=>:"+".class 
#> Symbol 
=> ":+".class 
#> String 
+1

非常感謝,它現在可以使用!對不起,我沒有足夠的信譽來投票給你呢:( – Yumiko

3

問題不在於引號。行情意味着元素是String類型,您的規格預計Symbol

outcomes.push(":#{temp}") 

應該

outcomes.push(temp.to_sym) 

爲了給你一個想法

2.1.2 :006 > :*.class 
=> Symbol 
2.1.2 :007 > ":*".class 
=> String 
+0

其實只是'temp.to_sym' – GolfWolf

+0

@ w0lf好點,謝謝。 –

+0

我試圖改變它這個樣子,但結果還是一樣, 'ELSIF x.to_i == 0 TEMP = x.to_sym outcomes.push( 「:#{}溫度」) 結束' – Yumiko

1

":#{temp}"生成以冒號開頭的字符串。

但是,您要將temp字符串翻譯爲符號,如temp.to_sym。或者你想建立一個這樣的符號::"#{temp}"(注意冒號位於字符串的前面)。

+0

感謝你的幫助,=) 你是天才 – Yumiko

2

西蒙娜Carletti酒店已經提供了solution for your problem(使用to_sym),但你可以進一步提高代碼:

  • split(' ')可以(在這種情況下)與split更換(不帶參數)
  • ,而不是elsif x.to_i == 0您可以使用else
  • collect(或map)已經創建並返回一個數組,您只需提供值

應用到你的代碼:

def tokens(str) 
    str.split.map { |x| x.to_i != 0 ? x.to_i : x.to_sym } 
end 

您可能需要修改你的病情,因爲x.to_i != 0回報falsex = "0"

def tokens(str) 
    str.split.map do |x| 
    if x.to_i != 0 
     x.to_i 
    else 
     x.to_sym 
    end 
    end 
end 

您可以在一個線路使用ternary if甚至寫這篇文章。

+0

如果x =〜/^[+ - ]?\ d + $ /'代替'if x.to_i == 0'來壓扁bug @JörgWMittag Yumiko在一個真正的應用程序中,你也需要擔心不好的數據,例如「9cats」.to_i => 9'。 –

相關問題