String kann in der TestFirst-Lektion nicht in Fixnum umgewandelt werden
-
21-12-2019 - |
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
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