Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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 foo bar未打印正确的输出_Ruby_Fizzbuzz - Fatal编程技术网

Ruby foo bar未打印正确的输出

Ruby foo bar未打印正确的输出,ruby,fizzbuzz,Ruby,Fizzbuzz,目前,我的代码将显示1到100,但当它被3或5整除或两者都整除时,实际上不会打印case语句……我在这里做错了什么 def display(item_count) n = 1 while n <= item_count case n when n % 3 == 0 puts "foo" when n % 5 == 0 puts "bar" when (n % 3 ==0 && n % 5 == 0)

目前,我的代码将显示1到100,但当它被3或5整除或两者都整除时,实际上不会打印case语句……我在这里做错了什么

def display(item_count)
  n = 1  
  while n <= item_count
    case n
    when n % 3 == 0 
      puts "foo"
    when n % 5 == 0
      puts "bar"
    when (n % 3 ==0 && n % 5 == 0) 
      puts "foobar"
    else
      puts "#{n}"
    end #--  case end stmt
    n = n + 1
  end #while end statement
end #end satement for metod

puts " How many items do you want to see"
item_count = gets.chomp.to_i
puts "#{display(item_count)}"
def显示(项目计数)
n=1
而n
打印“输入次数”
每个人都做|
放置(
“”。轻触do | res|

res显示某个对象是一回事;将某个函数的结果存储在内存中以供进一步使用(如通过网络连接或存储进行传输)是另一回事。在ruby中,所有东西都是对象,因此您应该对对象进行操作。ruby就是为了这个目的而制造的

编辑以解决多次循环和可读性问题

我的原稿被谴责为不可读,然后有人提出了一个使用lambda文字和猴子补丁的一元解决方案。即使是经验丰富的程序员也会被挑战遵循它的逻辑,而解释器中涉及的堆栈操作将可伸缩性抛到了窗外。单循环中的程序块解决了所有问题“可读”也意味着“可以理解”

在ruby>=2.4中,冻结字符串文字不应该是必要的;它们应该自动冻结,但因为单循环解决方案是为了解决可伸缩性问题(想象一下调用它一百万次),我们不应该忽视这个优化。另外,我已经将它简化为块中的单个条件语句,这意味着更大的可伸缩性

print 'How many items do you want to see: '.freeze

list = (1..gets.to_i).collect do |i|
  div_by_3 = (i % 3).zero?
  div_by_5 = (i % 5).zero?
  case 
    when div_by_3 && div_by_5
      :foobar
    when div_by_3
      :foo
    when div_by_5
      :bar
    else
     i
  end
end

puts list.to_s
输出:

How many items do you want to see: 50
[1, 2, :foo, 4, :bar, :foo, 7, 8, :foo, :bar, 11, :foo, 13, 14, :foobar, 16, 17, :foo, 19, :bar, :foo, 22, 23, :foo, :bar, 26, :foo, 28, 29, :foobar, 31, 32, :foo, 34, :bar, :foo, 37, 38, :foo, :bar, 41, :foo, 43, 44, :foobar, 46, 47, :foo, 49, :bar]
当使用
==
表达式时,会将您给出的参数与每个
表达式进行比较(在大多数情况下与
==
相同)。因此,您的代码大致相当于

if (n % 3 == 0) === n
  puts "foo"
elsif (n % 5 == 0) === n
  puts "bar"
elsif (n % 3 == 0 && n % 5 == 0) === n
  puts "foobar"
else
  puts "#{n}"
end

表达式返回
true
false
时,所有的
表达式都会返回
值,因此每种情况都会失败,您最终会使用
else
值。只需使用此
if
格式而不是
case
格式,您就可以做您想做的事情(尽管您需要重新安排条件以获得正确的输出).

您可以在ruby中使用不带参数的case语句。when子句仍然必须返回true或false

case
when true
  puts 'this happens'
when false
  puts 'this does not happen'
end
因此,如果您只需更改

case n
进入

并将“foobar”测试移到“when”列表的顶部。我的另一个答案也使用此结构,但消除了堆栈操作,并生成一个可存储/可传输的对象,而不仅仅是显示结果


注意:对对象调用zero?方法比将其与文本0进行比较快。(x.zero?比x==0快).

foobar问题的确切目的是检测/排除编写类似代码的人。因此,问题确实按照预期运行。目前,我的代码将显示1到100,但当它可以被3或5整除或两者整除时,实际上不会打印case语句……我做错了什么?请阅读Ruby中的相关内容,直到y为止你会发现为什么发布的代码总是使用
else
分支是显而易见的。@axiac…好吧,我知道我做错了什么。.这是一个新的实现:def display(item_count)n=1,而n这更被称为fizzbuzz。非常实用,不太可读。:)让我们看看我是否能想出一个更好的代码片段。解决方案尽管可读性更差/@SergioTulentsev我在第一个版本中就是这么做的,但后来我决定循环2个元素没有任何意义:)当然,
case
是一种方法。我想我有一个,但不知道如何使用
.grep
(以一种干净的方式)。哦,好吧…@SergioTulentsev这样:
(1..get.to_i).map{i | filters.map{f,v | v if f==i}.join.tap{| e | e这绝不是一种ruby方式。三个后续循环而不是唯一需要的循环会立即使代码无法接受。现实世界并非如此;您的反对超出了可伸缩性的范围。与程序员时间相比,硅是便宜的。如果可伸缩性是一个主要问题,您可以事实上,我们可以用一个单独的map.with_index做同样的事情,但这会很难看。Ruby代码通常用于通过网络传输结果,或者转换存储的数据并再次存储。为此,您必须将结果放入数据结构中。此代码也完全不可读(阅读:这是一个完美的例子,说明人们永远不应该写ruby。)替换列表、三个不必要的三元组、冗余检查:所有这些都有味道。旁注:您不需要
在第一行中添加一个
,范围也是合适的。虽然我会用不同的措辞,但我必须同意mudasobwa。这不是惯用ruby的样子。在本主题的所有代码片段中,on问题中的e最接近ruby way(显然需要一些修复。比如将打印与计算分离)@SergioTulentsev如果你真的阅读了我的答案,我不是想发布一个完整的工作解决方案。我正在向OP展示他的代码实际执行的逻辑。:)啊,对不起,我的错:)“仍然必须返回true或false”-不完全正确。只是truthy/falsy,就像ruby中的大多数一样。你是对的,这是一个重要的区别。
case n
case