2016-09-21 4 views
3

В настоящее время я пытаюсь узнать рубин на «Learn Ruby, The Hard Way» Вот мой вопрос ...Некоторые вопросы о символе и метода экземпляра в Руби

Следующий код взяты из упражнения 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 в этом случае?

Я не совсем уверен, в чем отличия, или, может быть, это очень читаемо для большинства рубистов?

А второй - это одна и та же линия.

method(:find_city) 

Я знаю, что это позволяет мне позвонить по методу find_city. Но опять же, почему я должен положить двоеточие до find_city? Этот код означает разбор аргументов, которые я вставлял в символы?

ответ

-2

Так что на самом деле определили proc, и сделать :findfind_city и вроде как ключ и значение ... Возможно ...

0

cities[:find] = method(:find_city)

Здесь cities хэш и метод объект, возвращаемый method(:find_city), назначен на хэш-ключ find, который является символом.

Я думаю, это зависит от вас и от контекста программы, где вы пишете это.

Простой method_var = method(:find_city) будет работать здесь также.


method(:find_city)

Я знаю, что это позволяет мне вызвать метод find_city. Но опять же, почему я должен положить двоеточие перед find_city? Этот код означает синтаксический анализ аргументов, которые я вставлял в символы?

Здесь вы передаете имя метода в качестве аргумента, вы должны либо передать его в качестве symbol или string.

0

В Ruby метод method создает объект метода. Это позволит вам передать его в свой код и вызвать его позже, используя метод .call объекта Method. Поскольку вызов method(my_method) оценил my_method и передал результат , вам нужно указать способ, которым следует использовать метод method. Вот почему вы в основном передать имя метода как символ в метод method: D

2

Я должен сказать, что Learn рубин The Hard Way дает нам действительно очень хороший пример того, что мы не должны делать. Ни один рубист никогда не наберет такой код в своих проектах. Этот фрагмент кода запутан, не читается и является злоупотреблением метапрограммированием.

В любом случае, я разбираю этот код для вас.

Запутанная часть начинается с этой строкой:

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 объект обертками, который является верхней (aka main), Method#call возвращает любой метод, завернутый в возвраты. Так что это выражение просто find_city(cities, state), написанное в чужой стиль.

+0

'написанный в чужой стиль': D +1! –