From last post,
there's a question. memorization on falsy case.
Thank you @jakebman . :)
I changed code.
clas Smile
SmileError = Class.new(StandardError)
attr_accessor :smile
# @smile is false on initialization.
def initialize
@smile = false
end
def ensmile(cry: false)
@smile ||= begin
puts 'memorize start'
raise SmileError if cry
puts 'memorize success'
"SMILE"
rescue SmileError
puts 'memorize fail'
"CRY"
end
end
end
(spec file is same)
And ran rspec
FF
Failures:
1) Smile#ensmile returns "SMILE"
Failure/Error: expect(smile.smile).to be_nil
expected: nil
got: false
# ./spec/smile_spec.rb:8:in `block (3 levels) in <top (required)>'
2) Smile#ensmile returns "CRY"
Failure/Error: expect(smile.smile).to be_nil
expected: nil
got: false
# ./spec/smile_spec.rb:14:in `block (3 levels) in <top (required)>'
Finished in 0.04088 seconds (files took 0.48848 seconds to load)
2 examples, 2 failures
Failed examples:
rspec ./spec/smile_spec.rb:7 # Smile#ensmile returns "SMILE"
rspec ./spec/smile_spec.rb:13 # Smile#ensmile returns "CRY"
It's okay because of false
after initialization.
Just fix spec file.
-------- a/spec/smile_spec.rb
+++ b/spec/smile_spec.rb
@@ -5,13 +5,13 @@ RSpec.describe Smile do
let(:smile) { described_class.new }
describe '#ensmile' do
it 'returns "SMILE"' do
- expect(smile.smile).to be_nil
+ expect(smile.smile).to be_falsy
expect(smile.ensmile).to eq 'SMILE'
expect(smile.smile).to eq 'SMILE'
end
it 'returns "CRY"' do
- expect(smile.smile).to be_nil
+ expect(smile.smile).to be_falsy
expect(smile.ensmile(cry: true)).to eq 'CRY'
expect(smile.smile).to eq 'CRY'
end
Then re-ran rspec
.
Finished in 0.00841 seconds (files took 0.4119 seconds to load)
2 examples, 0 failures
Okay. And check on pry.
1) nil
2.4.0 (main):0 > a=nil
=> nil
2.4.0 (main):0 > a ||= 'cat'
=> "cat"
2.4.0 (main):0 > a
=> "cat"
b) false
2.4.0 (main):0 > b=false
=> false
2.4.0 (main):0 > b ||= 'dog'
=> "dog"
2.4.0 (main):0 > b
=> "dog"
3) already set to Object something
2.4.0 (main):0 > r='roo tiger'
=> "roo tiger"
2.4.0 (main):0 > r ||= 'nwo'
=> "roo tiger"
2.4.0 (main):0 > r
=> "roo tiger"
If I'd like to keep false
on initialize, it is not working.... 😢
TIL: don't do under falsy condtion and don't do in your home.
Top comments (0)