gpt4 book ai didi

ruby-on-rails - 关于Ruby中symbol和instance method的一些问题

转载 作者:数据小太阳 更新时间:2023-10-29 08:11:19 25 4
gpt4 key购买 nike

我目前正在尝试在“艰难地学习 Ruby”上学习 Ruby这是我的问题...

以下代码来自练习 40:

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

cities[:find] = method(:find_city)

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

break if state.empty?

puts cities[:find].call(cities, state)
end

我研究了代码,终于明白了它是如何工作的。但我仍然不明白两件事:

首先...

在代码的中间,它定义了一个变量

cities[:find] = method(:find_city)

据我所知,:(冒号)声明了一个符号。我想知道将变量命名为 cities[:find] 是否更好而不是在这种情况下使用 cities_find

我不太确定有什么不同,或者它对大多数 ruby​​ist 来说可读性更强?

第二个也是差不多的。

method(:find_city)

我知道它允许我调用 find_city 方法。但是,为什么我必须在 find_city 之前加一个冒号?此代码是否意味着解析我放入符号的参数?

最佳答案

我不得不说,艰难地学习 Ruby 给了我们一个非常非常好的例子,说明我们不应该做什么。没有 ruby​​ist 会在他/她的项目中输入这样的代码。这段代码令人困惑,不可读,是对元编程的滥用。

无论如何,我会为您剖析该代码。

令人困惑的部分从这一行开始:

cities[:find] = method(:find_city)

让我们看看 = 的右侧.它调用一个名为 method 的方法,你可能猜到了,方法调用的返回值是方法find_city ,更准确地说,一个 Method包装方法的对象 find_city及其范围。然后该方法存储在哈希 cities 中, 符号为 :find作为关键。所以 cities 的值现在变成了

{
'CA'=> 'San Francisco',
'MI'=> 'Detroit',
'FL'=> 'Jacksonville',
'NY' => 'New York',
'OR' => 'Portland',
:find => #<Method:main.find_city>
}

你可以看到最后一个键值对真的很奇怪,它不应该在那里,因为散列 cities应该只存储州和他们的首都。见鬼!

然后出现了这个更奇怪的表达式 cities[:find].call(cities, state) .让我们看看这是如何工作的。

cities[:find]只需检索 Method哈希中的对象(还记得它包装的是什么方法吗?)

cities[:find].call(cities, state)调用它包装的方法,即 find_city , 在 Method 的范围内对象包装,这是顶级对象(又名 main ),Method#call返回包装在返回中的任何方法。所以这个表达式就是 find_city(cities, state) , 以外星人的风格写成。

关于ruby-on-rails - 关于Ruby中symbol和instance method的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39609305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com