我目前正在rubymonk.com上进行练习,但是我无法理解这个问题。
我打算写三种方法,加,减和计算。 Calculate是一种根据传递给方法的最后一个参数组合add和subtract方法的方法,该方法应该是包含符号':add'或':subtract'的哈希
这是解决方案代码:
def add(*numbers)
numbers.inject(0) { |sum, number| sum + number }
end
def subtract(*numbers)
sum = numbers.shift
numbers.inject(sum) { |sum, number| sum - number }
end
def calculate(*arguments)
# if the last argument is a Hash, extract it
# otherwise create an empty Hash
options = arguments[-1].is_a?(Hash) ? arguments.pop : {}
options[:add] = true if options.empty?
return add(*arguments) if options[:add]
return subtract(*arguments) if options[:subtract]
end
我理解除了这一行之外的一切:
options = arguments[-1].is_a?(Hash) ? arguments.pop : {}
即便如此,我明白发生了什么,但我不明白为什么会有第二个'?'或为什么':{}'在那里。谁能向我解释这里发生了什么?
谢谢!
答案 0 :(得分:1)
评论实际上解释了它。写它的另一种方法是:
if (arguments[-1].is_a?(Hash)) {
arguments.pop
}
else {
{}
}
其中arguments [-1]表示最后一个参数。
答案 1 :(得分:1)
这是一个三元逻辑运算符。
格式为:
<expression to evaluate> ? <result if expression> : <result if !expression>
因此,在您的情况下,运算符是:
的简写if arguments[-1].is_a?(Hash)
arguments.pop
else
{}
end
此外,{}是空Hash对象的构造函数 - 这是一个guard子句,用于确保在赋值后options
不会nil
。