loading...

Simple Memorization BEYOND

alyson profile image aly quey ・2 min read

This REPO

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.

Posted on by:

alyson profile

aly quey

@alyson

Always traveling, I vomit. :cry:

Discussion

pic
Editor guide