目前,我有这样的打印
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] = 10
和stamp_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"