لا يمكن إكراه السلسلة في فيكسنوم في درس تيست فيرست
-
21-12-2019 - |
سؤال
أنا أعمل من خلال TestFirst.org الدروس وحصلت على رسالة خطأ لا أستطيع فك:
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)>'
هنا هو رمز تلك الأخطاء يتحدثون عن ("ديف تكرار" هو خط 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
وهنا هو اختبار أشعل النار التي انطلقت:
it "should repeat a number of times" do
repeat("hello", 3).should == "hello hello hello"
end
أفهم أن رسالة الخطأ تتعلق بمحاولة استخدام سلسلة مثل قيمة رقمية ولكن لا يمكنني رؤية كيف أو مكان حدوث ذلك
المحلول
أدناه هو مصدر المشكلة
repetition = repetition + " " + say
# ^ this is a Fixnum
في الخط repetition + " " + say
, ، أنت تحاول أن تفعل سلسلة بين أ Fixnum
و String
المثال ، الذي تسبب في الخطأ لا يمكن إكراه السلسلة في فيكسنوم.
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 >
يمكن كتابة التعليمات البرمجية الخاصة بك على النحو التالي :
#!/usr/bin/env ruby
def repeat (say, how_many = 1)
("#{say} " * how_many).strip
end
في بلدي اختبار.الميزانية العادية ملف :-
require_relative "../test.rb"
describe "#repeat" do
it "returns 'hello' 3 times" do
expect(repeat('hello', 3)).to eq('hello hello hello')
end
end
يتيح تشغيل الاختبار :-
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>
تحديث
repetition = say
how_many = how_many-1
how_many.times do |repetition|
إذا كنت تعتقد, repetition
أعلن خارج الكتلة وداخل الكتلة هي نفس الشيء, ، أنت تماما خطأ.هم مختلفون ، كما خلقوا في 2 نطاقات مختلفة.انظر المثال أدناه :-
var = 2
2.times { |var| var = 10 } # shadowing outer local variable - var
var # => 2
لا تنتمي إلى StackOverflow