Frage

Ich arbeite gerade an den TestFirst.org-Tutorials und habe eine Fehlermeldung erhalten, die ich nicht entschlüsseln kann:

 Failure/Error: repeat("hello").should == "hello hello"
 TypeError:
   String can't be coerced into Fixnum
 # ./03_simon_says/simon_says.rb:13:in `+'
 # ./03_simon_says/simon_says.rb:13:in `block in repeat'
 # ./03_simon_says/simon_says.rb:12:in `times'
 # ./03_simon_says/simon_says.rb:12:in `repeat'
 # ./03_simon_says/simon_says_spec.rb:39:in `block (3 levels) in <top (required)>'

Hier ist der Code, von dem diese Fehler sprechen („def repeat“ ist Zeile 09)

def repeat (say, how_many=2)
    repetition = say
    how_many = how_many-1

    how_many.times do |repetition|
        repetition = repetition + " " + say
    end

    return repetition
end

Und hier ist der Rake-Test, der es auslöste:

it "should repeat a number of times" do
  repeat("hello", 3).should == "hello hello hello"
end

Ich verstehe, dass es in der Fehlermeldung um den Versuch geht, eine Zeichenfolge wie einen numerischen Wert zu verwenden, aber ich kann nicht erkennen, wie oder wo das geschieht

War es hilfreich?

Lösung

Das Folgende ist die Problemquelle

repetition = repetition + " " + say
#              ^ this is a Fixnum

In der Schlange repetition + " " + say, du versuchst ein Verkettung zwischen a Fixnum Und String Instanz, die den Fehler verursacht hat String kann nicht in Fixnum erzwungen werden.

2.1.2 :001 > 1 + ""
TypeError: String can't be coerced into Fixnum
        from (irb):1:in `+'
        from (irb):1
        from /home/arup/.rvm/rubies/ruby-2.1.2/bin/irb:11:in `<main>'
2.1.2 :002 >

Ihr Code kann wie folgt geschrieben werden:

#!/usr/bin/env ruby

def repeat (say, how_many = 1)
  ("#{say} " * how_many).strip
end

In meinem test_spec.rb Datei :-

require_relative "../test.rb"

describe "#repeat" do
  it "returns 'hello' 3 times" do
    expect(repeat('hello', 3)).to eq('hello hello hello')
  end
end

Lasst uns den Test durchführen:-

arup@linux-wzza:~/Ruby> rspec spec/test_spec.rb
.

Finished in 0.00129 seconds (files took 0.1323 seconds to load)
1 example, 0 failures
arup@linux-wzza:~/Ruby>

aktualisieren

repetition = say
how_many = how_many-1
  how_many.times do |repetition|

Wenn du denkst, repetition außerhalb des Blocks und innerhalb des Blocks deklariert sind Dasselbe, das bist du vollkommen falsch.Sie sind unterschiedlich, wie sie in geschaffen wurden 2 verschiedene Geltungsbereiche.Siehe das folgende Beispiel:-

var = 2
2.times { |var| var = 10 } # shadowing outer local variable - var
var # => 2
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top