我对以下内容感到困惑:find来自第17行,以及:findcity ......是如何在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
答案 0 :(得分:2)
对于初学者来说,如果你是Ruby的初学者,那就不用费心去理解它了。这不是通常用Ruby做事的方式。
但是这里有一些解释:
:find
是Symbol,可能是:搜索或此示例中的其他内容。
您实际上可以使用其他变量来存储方法,而不是存储在城市Hash内。像这样:
# 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
find_city
是代码中定义的方法。将符号:find_city
传递给方法method
会返回一个对象,表示类Method的方法(非常meta?)。
在上面的示例中,我们可以使用一个表示方法puts
的对象,我们可以使用该方法将方法call
发送到调用。
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