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

我有一个程序,看起来像:

$offset = Point.new(100, 200); def draw(point) pointNew = $offset + point; drawAbsolute(point) end draw(Point.new(3, 4)); 

$offset的使用似乎有点奇怪。

在C语言中,如果我定义了任何函数以外的东西,它就是一个全局variables。 为什么在Ruby中它必须是$offset但不能被offset ,仍然是全球性的? 如果是offset ,那么这是一个地方? 但地方到哪里,因为它感觉非常全球。

有没有更好的方法来编写上面的代码? 起初使用$offset可能看起来有点难看。


更新:我可以把这个偏移量放在class定义中,但是如果两个或几个类需要使用这个常量呢? 在这种情况下,我仍然需要定义一个$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中的variables范围在某种程度上由sigils控制。 以$开头的variables是全局variables,具有@的variables是实例variables, @@表示类variables,以大写字母开头的名称是常量。 所有其他variables是当地人。 当您打开一个类或方法时,这是一个新的作用域,并且前一个作用域中可用的当地程序不可用。

我通常宁愿避免创build全局variables。 通常有两种技术可以达到我认为更清洁的目的:

  1. 在模块中创build一个常量。 所以在这种情况下,您需要将所有需要偏移量的类放入模块Foo并创build一个常量Offset ,然后所有的类都可以访问Foo::Offset

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

全局variables需要一个前缀( $ )的原因之一是因为在Ruby中,与C不同,在分配给它们之前,你不必声明你的variables,所以没有给定全局variables的特定前缀, offset = Point.new(100, 200)在你的绘图方法中,那么Ruby将不知道你是指的是现有的variables还是在你的方法中创build一个新的局部variables。 与实例variables的@前缀相同。

我认为这是你声明抵消的文件的本地。 考虑每个文件本身就是一种方法。

也许把整个事情放到一个类中,然后用@@offset = Point.new(100, 200);来抵销一个类variables@@offset = Point.new(100, 200);