Ruby: сопоставить теги с логическим условием для получения истинного / ложного результата - PullRequest
0 голосов
/ 09 апреля 2010

У меня есть массив тегов для каждого элемента, например:

item1 = ['new', 'expensive']
item2 = ['expensive', 'lame']

У меня также есть логическое выражение в виде строки на основе возможных тегов:

buy_it = "(new || expensive) && !lame"

Как я могу определить, соответствует ли элемент критериям покупки на основе тегов, связанных с ним? Первоначально я думал сделать gsub для всех слов в buy_it, чтобы они стали 'true' или 'false' на основе их существующих в массиве тегов itemx, а затем выполнить полученную строку для получения логического результата.

Но так как сообщество Ruby обычно более креативно, чем я, есть ли лучшее решение?

EDIT:

Просто чтобы уточнить, buy_it в моем примере - динамический, пользователи могут изменить критерии для покупки чего-либо во время выполнения.

Ответы [ 2 ]

1 голос
/ 09 апреля 2010

В соответствии с вашей идеей gsub вместо того, чтобы каждый раз заменять каждое слово на true / false, почему бы не заменить каждый «запрос» выражением, которое можно использовать повторно, например, пример buy_it:

buy_it = "(new || expensive) && !lame"
buy_it_expr = buy_it.gsub(/(\w+)/, 'tags.include?("\1")')

puts buy_it_expr
=> (tags.include?("new") || tags.include?("expensive")) && !tags.include?("lame")

Это может быть оценено как Proc и использовано так:

buy_it_proc = eval "Proc.new { |tags| #{buy_it_expr} }"

buy_it_proc.call(item1)
=> true
buy_it_proc.call(item2)
=> false

Конечно, нужно позаботиться о том, чтобы выражение не содержало вредоносного кода. (Одним из решений может быть удаление из строки всех символов оператора, кроме разрешенных, и, конечно, опасаться исключений во время eval.)

0 голосов
/ 09 апреля 2010

Хороший кандидат здесь - хеш.

items = {'ipad' => ['new', 'expensive'], 'kindle' => ['expensive', 'lame']}
items.each do |name,tags|
  if tags.include?('new' || 'expensive') && !tags.include?('lame')
    puts "buy #{name}."
  else
    puts "#{name} isn't worth it."
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...