Ruby atribuindo strings True e False?

Sep 02 2020

Você consegue atribuir strings como verdadeiro e falso?

por exemplo, estou começando com um hash:

shopping_list = {
  "milk" => false,
  "eggs" => false,
  "jalapenos" => true
}

puts "Here is your Shopping List:"

shopping_list.each do |key, value|
  puts "#{key} - #{value}"
end

Eu queria a saída para opções de venda "compradas" para truee "não compradas" para false.

Respostas

2 TimurShtatland Sep 02 2020 at 16:39

Use um inline if ou um ternary if operator:

shopping_list = {
  "milk" => false,
  "eggs" => false,
  "jalapenos" => true
}

puts "Here is your Shopping List:"

shopping_list.each do |key, value|
  puts "#{key} - #{if value then 'purchased' else 'not purchased' end}"
  # or this:
  # puts "#{key} - #{value ? 'purchased' : 'not purchased'}"
end

Impressões:

Here is your Shopping List:
milk - not purchased
eggs - not purchased
jalapenos - purchased

Qual operador usar: operador ternário ( ?:) ou if/then/else/end?

Escolhi aqui if/then/else/end, mas listei as duas opções como aceitáveis. É uma questão de estilo qual você escolher.

Alguns usuários do Stack Overflow Ruby preferem usar um regular if ... then ... else ... end. É mais longo, mas mais claro e mais idiomático. Veja, por exemplo, estas respostas:
https://stackoverflow.com/a/2175392/967621
https://stackoverflow.com/a/4253250/967621

Outros usuários do Stack Overflow preferem ?:, que é mais conciso e claro, se você estiver acostumado. Observe também que o Guia de Estilo Ruby concorda:

Prefira o operador ternário ( ?:) em vez de if/then/else/endconstruções. É mais comum e obviamente mais conciso.

# bad
result = if some_condition then something else something_else end

# good
result = some_condition ? something : something_else
3 Spikie Sep 02 2020 at 16:37

Isso respondeu à sua pergunta?

shopping_list.each do |key, value|
   puts "#{key} - #{purchased?(value)}"
end


def purchased?(boolean)
  boolean ? 'purchased' : 'not purchased' 
end
2 Stefan Sep 02 2020 at 16:43

Eu estava querendo a saída para puts "comprado" para verdadeiro e "não comprado" para falso.

Você normalmente começa com uma ifexpressão :

shopping_list.each do |key, value|
  if value
    puts "#{key} - purchased"
  else
    puts "#{key} - not purchased"
  end
end

Mais tarde, você pode tentar remover as partes do código duplicadas.


Você consegue atribuir strings como verdadeiro e falso?

Isso soa como um mapeamento. Você pode usar outro hash:

states = {
  true => 'purchased',
  false => 'not purchased'
}

E consulte esse hash ao imprimir sua lista de compras:

shopping_list.each do |key, value|
  puts "#{key} - #{states[value]}"
end

Aqui, states[value]busca o valor de saída valuedo stateshash.