scerrecrow
scerrecrow

Reputation: 269

Ruby method calls without defining variables

I am beyond confused on where the :find is coming from line 17, as well as :findcity... is that how you call a fucntion within a predefined method call from ruby???

 cities = {'CA' => 'San Francisco',
 'MI' => 'Detroit',
 'FL' => 'Jacksonville'}

 cities['NY'] = 'New York'
 cities['OR'] = 'Portland'

 def find_city(map, state)
   if map.include? state
     return map[state]
   else
     return "Not found."
   end
 end

 # ok pay attention!
 cities[:find] = method(:find_city)

 while true
   print "State? (ENTER to quit) "
   state = gets.chomp

   break if state.empty?

   # this line is the most important ever! study!
   puts cities[:find].call(cities, state)
 end

Upvotes: 1

Views: 86

Answers (1)

Ismael
Ismael

Reputation: 16720

For starters if you are a beginner in Ruby just don't bother trying to understand it. This is not the usual way of doing things in Ruby.

But here are some explanations:

:find is a Symbol and it could be :search or something else in this example.

You could actually use a different variable to store the method instead of storing inside the cities Hash. Like so:

# Instead of doing this
hash = {} # => {}
hash[:puts_method] = method(:puts)
hash[:puts_method].call("Foo")
# Foo

# You can just
puts_method = method(:puts)
puts_method.call("Foo")
# Foo

The find_city is the method defined in your code. Passing the symbol :find_city to the method method returns you an object representing that method (very meta uh?) of the class Method.

So like in the example above we can have an object representing the method puts with which we can send the method call to call it.

the_puts = method(:puts) 
# => #<Method: Object(Kernel)#puts>
the_puts.call("Hey!")
# Hey!
# => nil

# Which is the same as simply doing
puts("Hey!")
# Hey!
# => nil

Upvotes: 2

Related Questions