2014-12-27 1 views
0
def track_for stat 
     # This is a hash with 2 elements of proc 
     { 
     symbol: -> { send(stat) }, 
     array: -> { send(stat[0], stat[1]) } 
     }.freeze[stat.class.name.underscore.to_sym].call 
end 

freeze [stat.class.name.underscore.to_sym] .call, я понятия не имею об этом коде. Какова функция кода внутри [] и зачем использовать метод call? Кто может мне помочь? Очень ценю это.Метод замораживания рубином

ответ

3
  • freeze - предотвращает изменение в Hash (возвращает замороженный объект)
  • [] - обращается значение из хэша
  • stat.class.name.underscore.to_sym - Я полагаю, это возвращает в нижнем регистре, змея случай версия класса данного объекта имя (underscore не входит в стандартную библиотеку, поэтому я не совсем уверен)
  • call вызывает лямбду, связанную с stat.class.name.underscore.to_sym ключом.

Например, передавая ['foo', 'bar'] в качестве аргумента track_for бы ссылаться на send(stat[0], stat[1]) лямбда.

+0

Могу ли я использовать ' '' def track_for stat {send * stat} end '' 'вместо этого. Извините за формат. Я не знаю, как вставить код в комментарии – Daniel

+2

'{send * stat}', поскольку лямбда должна работать. – August

1

Если распутать код он может быть переведен на:

def track_for stat 
    case stat 
    when Symbol 
     send(stat) 
    when Array 
     send(stat[0], stat[1]) 
    end 
end 

хэша в коде используются для выбора правильного поведения в соответствии с переменным классом stat «s.

На самом деле, я не вижу никакой добродетели в коде OP выше над транслируемого кода - это менее читаемыми и не имеет никаких преимуществ во время выполнения (насколько я могу судить) ...