Skip to content

Instantly share code, notes, and snippets.

@oinak
Created September 15, 2015 16:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save oinak/28ca4deae6fd812fc3c5 to your computer and use it in GitHub Desktop.
Save oinak/28ca4deae6fd812fc3c5 to your computer and use it in GitHub Desktop.
Meditation on ruby hashes with procs as "dinamic conditions" for keys
>> h = {true => '1 is odd', false => '1 is even'}
=> {true=>"1 is odd", false=>"1 is even"}
>> h[true]
=> "1 is odd"
>> h = {1.odd? => '1 is odd', 1.even? => '1 is even'}
=> {true=>"1 is odd", false=>"1 is even"}
>> h[true]
=> "1 is odd"
>> p=1; h = {p.odd? => "#{p} is odd", p.even? => "#{p} is even"}
=> {true=>"1 is odd", false=>"1 is even"}
>> h[true]
=> "1 is odd"
>> p=0; h = {p.odd? => "#{p} is odd", p.even? => "#{p} is even"}
=> {false=>"0 is odd", true=>"0 is even"}
>> h[true]
=> "0 is even"
>> p=1; h={ -> { p.odd? }[] => 'odd', -> { p.even? }[] => 'even' }
=> {true=>"odd", false=>"even"}
>> h[true]
=> "odd"
>> p=0; h={ -> { p.odd? }[] => 'odd', -> { p.even? }[] => 'even' }
=> {false=>"odd", true=>"even"}
>> h[true]
=> "even"
>> f = -> (p) { { -> { p.odd? }[] => 'odd', -> { p.even? }[] => 'even' }[true] }
=> #<Proc:0x00000002052bf0@(irb):49 (lambda)>
>> f[1]
=> "odd"
>> f[0]
=> "even"
# alternative/better? readability (minimum ambiguity)
>> f = proc do |p|
Hash.new.merge(
proc { p.odd? }.call => 'odd',
proc { p.even? }.call => 'even'
).fetch(true)
end
=> #<Proc:0x00000001fac070@(irb):52 (lambda)>
>> f[1]
=> "odd"
@oinak
Copy link
Author

oinak commented Sep 15, 2015

p.odd? is a placeholder for more complex parametrized conditions

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment