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)