优化打印输出,我使用零检查.鲁比

  • 本文关键字:鲁比 打印 输出 优化 ruby
  • 更新时间 :
  • 英文 :


目前,我有这样的打印

print ((stamp_amount[0], 'first mark') unless stamp_amount[0].zero?), (', ' if !stamp_amount[0].zero? && !stamp_amount[1].zero?),
((stamp_amount[1], 'second mark') unless stamp_amount[1].zero?)

stamp_amount是一个具有2个整数值的数组

假设在当前情况下stamp_amount[0] = 10stamp_amount[1] = 3

输出预览:

10 first mark, 3 second mark

因此,如果stamp_amount[0] = 0,则不会显示10 first mark,部分。如果stamp_amount[1] = 0相同,则, 3 second mark部分不会显示

对我来说,这在理论上似乎有点不正确。你能给我推荐一个更正确或不那么痛苦的印刷品吗?:(

干杯!

您的代码试图用分隔符连接最多两个元素的序列。加入是一个已解决的问题,请参阅数组#加入。

然后可以将该问题简化为"问题";给定我的stamp_amount输入,我如何才能产生正确的序列;。现在,这可以通过一千种方式来实现。这里有一个:

def my_print(stamp_amount)
ary = [
!stamp_amount[0].zero? && stamp_amount[0],
!stamp_amount[1].zero? && stamp_amount[1],
].select{|elem| elem }

ary.join(', ')
end
my_print([10, 3]) # => "10, 3"
my_print([0, 3]) # => "3"
my_print([10, 0]) # => "10"
my_print([0, 0]) # => ""

这是另一个

ary = []
ary << stamp_amount[0] unless stamp_amount[0].zero?
ary << stamp_amount[1] unless stamp_amount[1].zero?
ary.join(', ')

还有一个。此版本可以处理任何长度的stamp_amount

ary = stamp_amount.reject(&:zero?)
ary.join(', ')

我会选择第三个,但对于初学者来说,第二个可能是最容易理解的。

使用select作为reject的替代方案(如Sergio Tulentsev回答的第3部分所示(。它只是可读的,根据上下文和未来对代码的更改,您可能更喜欢其中一个。

puts stamp_amount.select{ |a| !a.zero? }.join(", ")

输入和输出的几个例子是:

stamp_amount   output
--------------------------------------------------------------------------
10, 3          10, 3
10, 0          10
0, 3           3
0, 0           (prints an empty line, because the selected array is empty)

您在索引点上计算zero?的频率超过了需要的频率,但我首先要考虑的是重构代码的可读性。最好在print方法之外计算要打印的消息,并解释变量名的情况。

# rubocop is going to complain about variable assignment like this
first_amount, second_amount = *stamp_amount

实际上,我们可以使用rubocop更喜欢.zero?而不是== 0.empty?方法的原因来指导我们的开发。zero?本质上只是empty?,但它传达了你试图以更好的方式做什么的意义。当把字符串分配给解释它们在做什么的变量时,我会使用这种推理。

some_name_that_explains_what_this_is_0 = "#{first_amount} piecu centu marka" 
some_name_that_explains_what_this_is_1 = "#{second_amount} tris centu marka"

您当前的代码是令人困惑的,因为您有可能打印一个字符串,如";10百分之一马克";这在词汇上没有意义,也可能不是你考虑后的样子,tis评估为"第二个标记",如果第一个值为零,这将带来问题。在开始将零整数转换为字符串之前,我们也可以拒绝它们。

array = [1, 0].reject(&:zero?)

现在,我们可以使用数组并执行以下操作:

string = []
array.each_with_index { |e, i| string << "#{e} #{Ordinalize.new(i).ordinalize} mark" }
message = string.join(', ')
print(message)
# ord class
class Ordinalize
def initialize(value)
@value = value
end
def ordinalize
mapping[@value]
end
def mapping
# acounting for zero index
['first', 'second']
end
end

在这里我们计算序数,让我们的新类为我们处理句子结构。

输出:

[1, 0] => "1 first mark"
[0, 1] => "1 first mark"
[1, 2] => "1 first mark, 2 second mark"

最新更新