在实例变量(Ruby)上使用unless或if语句

时间:2017-02-09 19:33:01

标签: ruby

我正在创建一个Elevator对象,其实例只能在第1层和第12层之间。该代码适用于上下实例方法,但我不能让电梯不超过12楼或者低于1楼。我尝试使用除非@floor> = 12,但是有语法错误。我确信它很简单,但我是Ruby的新手。

以下是有效的代码:

  def floor_limit
    if @@count == 12
      puts "You're Way Too High!"
    end

我想添加一个休息时间,以便在我们到达12楼时停止迭代,所以我写了这个,但它甚至不会放。

  def go_up
        unless @floor >= 12    
    @floor += 1
    notify
  end

我也尝试过:

class System
{
public:
    Interface() = default;
    virtual ~Interface() {}

    virtual void doSomething() = 0;
    virtual bool somethingDone() const = 0;

    virtual int trait1() const = 0;
    virtual bool trait2() const = 0;
};

class SomethingImplementation
{
public:
    SomethingImplementation() = default;
    void doSomething() { (void)0; }
    bool somethingDone() { return true; }
};

2 个答案:

答案 0 :(得分:2)

您将类实例变量与实例变量混合在一起,这将导致麻烦和混乱。如果您是Ruby的新手,我强烈建议您避免使用类实例变量,它们只会导致很多混乱。而是专注于使每个实例尽可能自包含。

为了使这更像Ruby,你可以做一些事情:

class Elevator
  # Define a valid range for this elevator
  FLOOR_RANGE_DEFAULT = (1..12)

  # Expose the current floor and range as properties
  attr_reader :floor
  attr_reader :range

  def initialize(floor, range = nil)
    @floor = floor.to_i
    @range = (range || FLOOR_RANGE_DEFAULT).to_a
  end

  def inspect
    @range.map do |floor|
      if (@floor == floor)
        '[%d]' % floor
      else
        ' %d ' % floor
      end
    end.join(' ')
  end
end

然后你的上下代码可以检查限制并拒绝这是否是无效操作。首先将移动代码与向上或向下解释的代码分开:

def up
  move(@floor + 1)
end

def down
  move(@floor - 1)
end

def move(target)
  if (@range.include?(target))
    @floor = target
  end

  @floor
end

现在你有了一个可以构建的框架。通过使用Ruby的范围功能之类的简单内容,您可以创建一个非常适应性强的类,可以处理具有其他限制的电梯等情况:

e = Elevator.new(1, (1..20))

或者只在奇数楼层停止:

e = Elevator.new(1, (1..20).select(&:odd?))

或者跳过第4,13和14日:

e = Elevator.new(1, (1..20).to_a - [ 4, 13, 14 ])

它不需要更多代码,只需要正确的代码。

答案 1 :(得分:0)

以下应该可以解决问题。

def go_up
    @floor += 1 unless @floor >= 12    
    notify
end

或者像这样:

def go_up
    @floor += 1 if @floor < 12    
    notify
end

它们都非常直观,所以它取决于你。

This是关于何时使用unless的非常详细的解释。 here是标准if / else /除非教程。