你如何在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中,一切都是一个对象。 鉴于此,如果您没有在Module
或Class
定义您的方法,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。 通常有两种技术可以达到我认为更清洁的目的:
-
在模块中创build一个常量。 所以在这种情况下,您需要将所有需要偏移量的类放入模块
Foo
并创build一个常量Offset
,然后所有的类都可以访问Foo::Offset
。 -
定义一个访问值的方法。 你可以在全局中定义这个方法,但是我认为最好把它封装在一个模块或类中。 这样,数据就可以在需要的地方使用,甚至可以根据需要进行更改,但是程序的结构和数据的所有权将更加清晰。 这更符合面向对象的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);
?