Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby程序未按预期运行?尽管条件失败,但仍执行If块_Ruby_If Statement - Fatal编程技术网

Ruby程序未按预期运行?尽管条件失败,但仍执行If块

Ruby程序未按预期运行?尽管条件失败,但仍执行If块,ruby,if-statement,Ruby,If Statement,以下程序旨在迭代holiday_散列,将所有键和值大写,并将其输出: def all_supplies_in_holidays(holiday_hash) holiday_hash.each do |key, value| key_string = key.to_s key_string.capitalize! puts "#{key_string}:" value.each do |key2, value2| if key2 == :new_year || :fou

以下程序旨在迭代holiday_散列,将所有键和值大写,并将其输出:

def all_supplies_in_holidays(holiday_hash)
  holiday_hash.each do |key, value|
  key_string = key.to_s
  key_string.capitalize!
  puts "#{key_string}:"
  value.each do |key2, value2|
    if key2 == :new_year || :fourth_of_july || :memorial_day 
     key_to_string = key2.to_s
     key_string1 = key_to_string.split
     final_array = []
     key_string1.each do |splitted_string|
     final_array = splitted_string.capitalize!
    end
    final_string = final_array.join(" ")
    print "#{final_string1}:"
  else
    key_string1 = key2.to_s
    print "#{key_string1}"
  end
  value2.each do |array_value|
    new_array_capitalized = []
    new_array_capitalized << array_value.capitalize!
    new_array.join(" ")
   end
  end
 end
end
假日杂凑如下:

  {
  :winter => {
    :christmas => ["Lights", "Wreath"],
    :new_years => ["Party Hats"]
  },
  :summer => {
    :fourth_of_july => ["Fireworks", "BBQ"]
  },
  :fall => {
    :thanksgiving => ["Turkey"]
  },
  :spring => {
    :memorial_day => ["BBQ"]
  }
}
问题是:

  • 即使条件的计算结果未能为true,if块也会执行
  • 所需建议:

  • 我如何简化符号大写的过程,因为符号中有两个词,比如:new_york to capitalized to new york?(因为资本化方法将返回纽约)
  • 即使条件未能计算为
    true

    让我们看看:

    key2 = :new_year
    key2 == :new_year || :fourth_of_july || :memorial_day
    #=> true
    
    现在是一个应该返回
    false
    的键:

    key2 = :thanksgiving
    key2 == :new_year || :fourth_of_july || :memorial_day
    #=> :fourth_of_july
    
    这不是您预期的结果,但您的假设也不正确:执行
    if
    块只是因为条件总是真实的

    为什么??因为它相当于:

    false || :fourth_of_july || :memorial_day
    #=> :fourth_of_july
    
    你想要:

    key2 == :new_year || key2 == :fourth_of_july || key2 == :memorial_day
    #=> false
    
    或者再短一点:

    [:new_year, :fourth_of_july, :memorial_day].include? key2
    #=> false
    

    我怎样才能简化大写有两个单词的符号的过程[…]

    我将
    按下划线拆分它们,
    将每个单词大写,然后
    将结果合并:

    :new_year
      .to_s              #=> "new_year"
      .split('_')        #=> ["new", "year"]
      .map(&:capitalize) #=> ["New", "Year"]
      .join(' ')         #=> "New Year"
    
    我分离了方法调用以显示中间结果。您可以将上述内容写在一行中:

    :new_year.to_s.split('_').map(&:capitalize).join(' ')
    #=> "New Year"
    
    即使条件未能计算为
    true

    让我们看看:

    key2 = :new_year
    key2 == :new_year || :fourth_of_july || :memorial_day
    #=> true
    
    现在是一个应该返回
    false
    的键:

    key2 = :thanksgiving
    key2 == :new_year || :fourth_of_july || :memorial_day
    #=> :fourth_of_july
    
    这不是您预期的结果,但您的假设也不正确:执行
    if
    块只是因为条件总是真实的

    为什么??因为它相当于:

    false || :fourth_of_july || :memorial_day
    #=> :fourth_of_july
    
    你想要:

    key2 == :new_year || key2 == :fourth_of_july || key2 == :memorial_day
    #=> false
    
    或者再短一点:

    [:new_year, :fourth_of_july, :memorial_day].include? key2
    #=> false
    

    我怎样才能简化大写有两个单词的符号的过程[…]

    我将
    按下划线拆分它们,
    将每个单词大写,然后
    将结果合并:

    :new_year
      .to_s              #=> "new_year"
      .split('_')        #=> ["new", "year"]
      .map(&:capitalize) #=> ["New", "Year"]
      .join(' ')         #=> "New Year"
    
    我分离了方法调用以显示中间结果。您可以将上述内容写在一行中:

    :new_year.to_s.split('_').map(&:capitalize).join(' ')
    #=> "New Year"
    

    可以但为什么呢?我不知道发生了什么事。我现在更糊涂了。。对不起,这不是因为你的回答,而是因为你刚才指出的事实。你能进一步解释一下为什么会发生这种情况吗?@ZeeshanShafqat对不起,我还在写我的答案,再次检查。好的。。但为什么呢?我不知道发生了什么事。我现在更糊涂了。。对不起,这不是因为你的回答,而是因为你刚才指出的事实。你能进一步解释为什么会发生这种情况吗?@ZeeshanShafqat对不起,我还在写我的答案,请再次检查。