arr = [50, 30, "+"]
我想移动" +"通过迭代在50到30之间。
我认为each_with_index
可以做到这一点,但到目前为止还没有运气。这是制作反向波兰表示法的过程的一部分。 (如果有人有兴趣,http://en.wikipedia.org/wiki/Reverse_Polish_notation)
def evaluate(arr)
arr.each_with_index {|ele, index| index-1 if x=="+"}
end
我想将=
,-
和*
等运算符移动一个索引,以便返回50 - 30
。谢谢!
答案 0 :(得分:3)
arr.values_at(0, 2, 1)
#=> [50, "+", 30]
arr.values_at(0, 2, 1).join(" ")
#=> "50 + 30"
答案 1 :(得分:1)
我这样做:
arr[-1], arr[-2] = arr[-2], arr[-1]
这会交换数组的最后两个元素。
答案 2 :(得分:0)
您可以创建一个临时数组:
def evaluate(arr)
temp = arr.dup
arr.each_with_index { |ele, index| temp[index-1] = ele }
temp
end
另一种方法是重复数组两次并抓住索引1-3处的元素:
(arr * 2)[1..3]
答案 3 :(得分:0)
这并没有直接回答你的问题,但是如果你想在Ruby中实现RPN,你就不需要做任何数组修改。您可以迭代您的操作并直接维护您的价值堆栈:
def rpn(*ops)
stack = []
ops.each do |op|
case op
when Numeric
stack.push op
else
value = stack.pop
receiver = stack.pop
stack.push receiver.send(op, value)
end
end
stack.first
end
puts rpn 5, 1, 2, "+", 4, "*", "+", 3, "-" # => 14
有趣的是,由于这是Ruby,操作只是发送给接收者的消息,所以你可以做超出基本数学的事情 - 例如,为了获得两个数字的最大公分母,Ruby提供了&# 34; GCD"方法,您可以将其输入RPN解析器!
puts rpn 64, 24, "gcd" # => 8