Здесь есть хеш (города) с ключом 3 пары => значение
cities = {'CA' => 'San Francisco', 'MI' => 'Detroit', 'FL' => 'Jacksonville'}
Вы можете получить доступ к этим значениям с помощью клавиши:
puts cities['CA'] #=> 'San Francisco'
Теперь добавим две новые пары.
cities['NY'] = 'New York'
cities['OR'] = 'Portland'
Весь хеш будет:
p cities #=> {'CA' => 'San Francisco', 'MI' => 'Detroit', 'FL' => 'Jacksonville', 'NY' => 'New York', 'OR' => 'Portland'}
Теперь определен метод с именем find_city
. Требуется хеш и ключ.
def find_city (map, state)
# if hash has the key, return its value. (There are better ways to do it.)
if map.include? state
return map[state]
else
return "Not found."
end
end
Здесь есть худший кусок кода на Ruby, который я когда-либо видел.
cities[:find] = method(:find_city)
Хорошо, этот код получает метод find_city
и превращает его в Method
объект, который может быть присвоен переменной. НО, вместо использования обычной локальной переменной, она сохраняется в значении хеша cities
!
Этот объект похож на метод, но это объект вместо метода, и его нужно вызывать с помощью call
(в Ruby 1.8.7).
Я буду использовать переменную с именем my_meth
(это может быть любое имя), чтобы объяснить лучше.
# get the method find_city and turns it into an object assigned to my_meth
my_meth = method(:find_city)
while true
print "State? (Enter to quit) "
state = gets.chomp
break if state.empty?
# here we use find_city on the cities hash.
puts my_meth.call(cities, state)
end
puts my_meth.class
Но вместо того, чтобы использовать переменную, оригинальный код хранил объект Method
в хэше cities
. Итак, города будут:
cities[:find] = method(:find_city)
p cities #=> {'CA' => 'San Francisco', 'MI' => 'Detroit', 'FL' => 'Jacksonville', 'NY' => 'New York', 'OR' => 'Portland', :find => (the Method object)}
Таким образом, вы можете получить доступ к find_city
через cities[:find].call
.