Ruby解释器忽略了elsif语句的条件

时间:2016-03-24 22:09:09

标签: ruby

我在课堂上讨论这个方法:

 def OpCodes
  if @asm[0] == "ADD"
   opcode = "111"
  elsif @asm[0] == "CMP"
   opcode = "110"
  elsif @asm[0] == "SHL"
   opcode = "101"
  elsif @asm[1] == "SHR"
   opcode = "100"
  elsif @asm[1] == "NOT"
   opcode = "011"
  elsif @asm[1] == "XOR"
   opcode = "010"
  elsif @asm[1] == "OR"
   opcode = "001"
  elsif @asm[1] == "AND"
   opcode = "000"
  else
   opcode = "ERROR"
  end
  @opcode = opcode 
  return @opcode
 end

当我运行代码时,例如我给它“添加1,3”字符串,它工作并返回“111”。但是,当我使用其他命令时,它会返回“ERROR”

1 个答案:

答案 0 :(得分:2)

您可以重写此内容以使用简单的查找表:

OPCODES = {
  ADD: 0b111,
  CMP: 0b110,
  SHL: 0b101,
  SHR: 0b100,
  NOT: 0b011,
  XOR: 0b010,
  OR: 0b001,
  AND: 0b000
}.freeze

OPCODE_ERROR = "ERROR".freeze

def opcode(instruction)
  OPCODES[instruction.to_sym] or OPCODE_ERROR
end

请注意,使用本机二进制数比使用相同的字符串表示要好得多,所以我在这里使用0bNNN表示法。 0b001为1,0b010为2.如果您希望将n.to_s(2)用于base-2,则可以转换回字符串。

此外,您永远不应该命名方法CamelCase样式,这些样式是为类和模块名称保留的。而是使用underscore_style

您好像没有正确解析输入。尝试使用正则表达式:

instruction, a, b = input.scan(/\A(\S+)\s+(\S+),\s*(\S+)/)[0]

对于类似"ADD 1,2"的内容,您可以将这些值分解为可以使用的三个变量。