首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Ruby中使用全局变量或常量值?

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

Stack Overflow用户
提问于 2009-06-25 06:03:23
回答 3查看 126.8K关注 0票数 68

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

代码语言:javascript
复制
$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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-06-25 12:10:03

你需要意识到的一件事是,在Ruby中,一切都是对象。鉴于此,如果您没有在ModuleClass中定义您的方法,Ruby将把它放在Object类中。因此,您的代码将是Object作用域的本地代码。

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

代码语言:javascript
复制
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)

希望这能澄清一点。

票数 53
EN

Stack Overflow用户

发布于 2009-06-25 07:40:00

全局变量需要前缀(称为"sigil")的原因之一是,在Ruby中,与C不同,您不必在为变量赋值之前声明变量。sigil被用作明确变量范围的一种方式。

在没有为全局变量指定特定前缀的情况下,如果在draw方法中使用了pointNew = offset + point语句,那么offset将引用该方法中的一个局部变量(在本例中会产生一个NameError )。用于引用实例变量的@和用于类变量的@@也是如此。

在其他使用显式声明的语言中,如CJava等,声明的位置用于控制作用域。

票数 10
EN

Stack Overflow用户

发布于 2009-06-25 06:06:42

我想它是你声明的偏移量的本地文件。把每个文件看作是一个方法本身。

也许可以将整个代码放入一个类中,然后使用@@offset = Point.new(100, 200);使offset成为一个类变量

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1042384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档