在永不运行的if块中重新调用数组会使其为零

时间:2015-04-27 16:43:53

标签: ruby

好的,所以我有一个函数,如果一个变量最终不是一个数组, 使它成为一个数组,原始变量的值为第一个和 唯一的元素 iv编写如下代码

variable = userInputOfSorts()
puts JSON.pretty_generate(variable) # Prints expected output, array with 2 values
if (!variable.is_a?(Array)
    variable = [variable]
end
puts variable # nil

现在,我已将调试语句放在if if(puts语句)中,并且可以确认它没有运行。

使用if块中的调试语句,我确定没有运行,我试图注释掉重新分配语句

# variable = [variable]

无所谓,无论如何都不会发表这种说法。但是按照上帝,它有效。显然,当用户输入不是数组时,我需要那个语句。

所以我的问题是,从未运行的重新分配语句使变量为null。

我写了一个例子,一个可以运行以证实这一点。它似乎与classes / attr_reader有关,因为它只是在类外编写并运行它时才有效。

require 'JSON'


class MainClass
  attr_reader :mock_input

  def initialize(input)
    puts "hello"

    @mock_input = input

    # Print with JSON or puts
    puts "-------"
    if (mock_input.is_a?(Array))
      puts JSON.pretty_generate mock_input
    else
      puts mock_input
    end
    puts "-------"

    if (!mock_input.is_a?(Array))
      puts "Converting to array..."
      mock_input = [mock_input]
    end

    # Print with JSON or puts
    puts "-------"
    if (mock_input.is_a?(Array))
      puts JSON.pretty_generate mock_input
    else
      puts mock_input
    end
    puts "-------"
  end
end

MainClass.new ["hello", "world"]

2 个答案:

答案 0 :(得分:0)

如果输入不是一个数组,那么将输入转换为数组会稍微短一些:

\n

使用原始代码:

def input_to_array(input)
  [*input]
end

答案 1 :(得分:0)

我提交了bug report,并得到了其中一位开发人员的答复。显然,在ruby中,如果被评估为false的块应该能够影响您的程序,则注释掉代码。 AKA,这不是一个bug,它是一个“功能”

但是,

我找到了解决方案

所以,最初的问题是

require 'JSON'


class MainClass
  attr_reader :mock_input

  def initialize(input)
    puts "hello"

    @mock_input = input

    # Print with JSON or puts
    puts "-------"
    if (mock_input.is_a?(Array))
      puts JSON.pretty_generate mock_input
    else
      puts mock_input
    end
    puts "-------"

    if (!mock_input.is_a?(Array))
      puts "Converting to array..."
      mock_input = [mock_input]
    end

    # Print with JSON or puts
    puts "-------"
    if (mock_input.is_a?(Array))
      puts JSON.pretty_generate mock_input
    else
      puts mock_input
    end
    puts "-------"
  end
end

MainClass.new ["hello", "world"]

更改行

mock_input = [mock_input]

@mock_input = [@mock_input]

修复它

PS:正如@Wayne Conrad指出的那样,我本可以完全使用Array(mock_input)而不是if语句。