Соответствие Ruby подмножествам и отображению множества (переменных) - PullRequest
2 голосов
/ 28 января 2012
feelings = Set["happy", "sad", "angry", "high", "low"]
euphoria = Set["happy", "high"]
dysphoria = Set["sad", "low"]
miserable = Set["sad", "angry"]

puts "How do you feel?"
str = gets.chomp
p terms = str.split(',')

if euphoria.proper_subset? feelings
  puts "You experiencing a state of euphoria."
else
  puts "Your experience is undocumented."
end

gets

Как сделать эйфорию переменной, например, если соответствующая строка для несчастного или дисфории совпадает и отображает имя набора.Нравится # {Set}

Ответы [ 2 ]

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

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

require 'set'

feelings = {
  euphoria: Set.new(%w[happy high]),
 dysphoria: Set.new(%w[sad low]),
 miserable: Set.new(%w[sad angry])
}

puts "What are you feeling right now?"
mood = Set.new gets.scan(/\w+/)
name, _ = feelings.find{ |_,matches| matches.subset?( mood ) }
if name
  puts "You are experiencing a state of #{name}"
else
  puts "Your experience is undocumented."      
end

Вызов gets.scan(/\w+/) возвращает массив строк.Это лучше, чем просто .split(','), потому что позволяет пользователю ставить пробел после запятой (например, «грустный, счастливый») или просто использовать пробелы (например, «грустный счастливый»).1008 * требует нескольких аргументов для этого.Вместо этого мы используем Set.new, который принимает массив значений.В качестве альтернативы вы могли бы использовать mood = Set[*gets.scan(/\w+/)], где * принимает массив значений и передает их в качестве явных параметров.

Кроме того, я изменил с proper_subset? на subset?, потому что "счастливыйhigh "не" собственно подмножество "happy, high", но это подмножество.

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

Всякий раз, когда вы думаете, что хотите поместить имя переменной в другую переменную, вы, вероятно, вместо этого захотите хеш:

states = {
    'euphoria'  => Set["happy", "high"],
    'dysphoria' => Set["sad",   "low"],
    'miserable' => Set["sad",   "angry"]
}

Тогда вы можете сказать что-то вроде:

which = 'euphoria' # Or where ever this comes from...
if states[which].proper_subset? feelings
  puts "You experiencing a state of #{which}."
else
  puts "Your experience is undocumented."
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...