如何在Ruby中使用全局变量或常量值?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (52)

我有一个程序:

$offset = Point.new(100, 200);

def draw(point)
  pointNew = $offset + point;
  drawAbsolute(point)
end

draw(Point.new(3, 4));

使用$offset看上去有点奇怪。

在C中,如果我在任何函数之外定义了什么东西,那么它就是一个自动的全局变量。为什么在Ruby中$offset但不可能offset但仍然是全局的?如果是的话那offset是本地的吗?

是否有更好的方法来编写上面的代码?使用$offset可能有点丑。

提问于
用户回答回答于

你需要意识到的一件事是在Ruby中,一切都是对象。鉴于此,如果你没有在规定的方法ModuleClass,ruby将会把它的内部Object类。所以,你的代码将在本地Object范围内。

面向对象编程的典型方法是封装类中的所有逻辑:

class Point
  attr_accessor :x, :y

  # If we don't specify coordinates, we start at 0.
  def initialize(x = 0, y = 0)
    # Notice that `@` indicates instance variables.
    @x = x
    @y = y
  end

  # Here we override the `+' operator.
  def +(point)
    Point.new(self.x + point.x, self.y + point.y)
  end

  # Here we draw the point.
  def draw(offset = nil)
    if offset.nil?
      new_point = self
    else
      new_point = self + offset 
    end
    new_point.draw_absolute
  end

  def draw_absolute
    puts "x: #{self.x}, y: #{self.y}"
  end
end

first_point = Point.new(100, 200)
second_point = Point.new(3, 4)

second_point.draw(first_point)

用户回答回答于

Ruby中的变量范围在某种程度上由sigils控制。以变​​量开始的变量$是全局变量,变量@是实例变量,@@意味着类变量,以大写字母开头的名称是常量。所有其他变量都是当地人。当打开一个类或方法时,这是一个新的作用域,并且前一个作用域中可用的程序不可用。

我通常宁愿避免创建全局变量。有两种技术通常达到我认为更清洁的相同目的:

在模块中创建一个常量。因此,在这种情况下,需要将所有需要偏移量的类放入模块中Foo并创建一个常量Offset,以便所有类都可以访问Foo::Offset

定义访问该值的方法。你可以在全局中定义这个方法,但是我认为把它封装在一个模块或类中会更好。这样数据就可以在你需要的地方得到,你甚至可以根据需要改变它,但是你的程序结构和数据所有权将会更加清晰。这更符合面向对象的设计原则。

扫码关注云+社区