我正在创建一个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; }
};
答案 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)