我有一个程序,看起来像这样:
$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
的使用乍一看可能有点丑陋。
更新:我可以将这个偏移量放在一个class
定义中,但是如果两个或几个类需要使用这个常量怎么办?在这种情况下,我是否仍然需要定义一个$offset
发布于 2009-06-25 12:10:03
你需要意识到的一件事是,在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)
希望这能澄清一点。
发布于 2009-06-25 07:40:00
全局变量需要前缀(称为"sigil")的原因之一是,在Ruby中,与C不同,您不必在为变量赋值之前声明变量。sigil被用作明确变量范围的一种方式。
在没有为全局变量指定特定前缀的情况下,如果在draw
方法中使用了pointNew = offset + point
语句,那么offset
将引用该方法中的一个局部变量(在本例中会产生一个NameError
)。用于引用实例变量的@
和用于类变量的@@
也是如此。
在其他使用显式声明的语言中,如C
、Java
等,声明的位置用于控制作用域。
发布于 2009-06-25 06:06:42
我想它是你声明的偏移量的本地文件。把每个文件看作是一个方法本身。
也许可以将整个代码放入一个类中,然后使用@@offset = Point.new(100, 200);
使offset成为一个类变量
https://stackoverflow.com/questions/1042384
复制相似问题