рубиновый хеш с методами на пару - PullRequest
2 голосов
/ 20 января 2012

Я использую грабли для получения и обработки данных.

Данные выглядят как "code:value", где каждый код соответствует определенному действию.

Например, "0xFE:0x47" вызывает метод, соответствующий тегу 0xFE с параметром 0x47.

В целях масштабируемости я думаю, что это должно быть сопоставлено с хэшем и иметь методы, определенные ниже:

tags = Hash[0xFA => taskA, 0xFB => taskB, 0xFC => taskC]

def taskA(value)
  ...
end

def taskB(value)
  ...
end

def taskC(value)
  ...
end

затем, когда сообщение получено, выполните split и вызовите метод для хеша, например:

tokens = message.split(':')
tags[tokens[0]](tokens[1])

Руби не нравится инициализация Hash. Как правильно решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Определить "не нравится".

Если вы попытаетесь инициализировать хеш, используя имена функций:

  1. Прежде чем функция будет определена, вы получите неопределенный символ.
  2. После того, как функция определена, вы просто выполняете функцию.

Если вы хотите отобразить значения в функции, которые вы можете вызвать, рассмотрите определение методов как Procs / lambdas:

> taskA = lambda { |value| puts "foo #{value}" }
> h = { 0x42 => taskA }
> h[0x42].call("bar")
foo bar

Вы также можете хранить символы, но я предпочитаю использовать известные существующие артефакты, например, переменную, поэтому IDE может помочь мне убедиться, что я делаю все правильно, поскольку он может знать - символы произвольные и нет способ убедиться, что они совпадают с существующим методом, отличным от попытки его вызова.

2 голосов
/ 20 января 2012

Возможно, вы ожидаете, что методы будут работать так же, как и в JavaScript, где они являются просто ссылками, пока не вызваны, но это не так.Лучше всего сохранить их как символы, а затем использовать метод send для их вызова:

# Define a mapping table between token and method to call
tags = {
  0xFA => :taskA,
  0xFB => :taskB,
  0xFC => :taskC
}

tokens = message.split(/:/)

# Call the method and pass through the value
send(tags[tokens[0]], tokens[1])

Инициализатор Hash[] обычно зарезервирован для особых случаев, например, при преобразовании массива вHash.В этом случае это избыточно, если не сбивает с толку, поэтому лучше не указывать.{ ... } создает эффект неявного хэша.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...