Ruby有5个变量范围:
x = 25
,y = gaurish
其中x
和y
是局部变量。@
符号表示。主要用于类,以便类的每个实例/对象具有不同/单独的值。例。 @employee.name = 'Alex'
@@
符号表示。类变量,我认为所有实例/对象都有相同的值。$
符号开头,随处可见 。示例$LOAD_PATH
ALL_CAPS
中的惯例开头。虽然,它是一个常数,但它的值不是常数,可以改变(虽然红宝石会发出警告)。从某种意义上说,这也像一个变量。 正如您所注意到的,以上所有都是存储某些类型值的变量,它们的值可以更改。但是,每个范围都会有所不同。拥有5种不同类型的可变范围让我感到困惑。主要是,我很难在什么情况下决定,我应该在我的代码中使用特定的范围。所以我脑子里有些问题。请回答:
global $x
变量。红宝石中的全局变量也被视为邪恶,因此不应使用。或者,在ruby中使用全局变量是否有意义?public
这样的事实上的选择?哪个是大多数用例?中的安全赌注?感谢您花时间阅读并回答问题
答案 0 :(得分:10)
类变量对于所有实例都是相同的,因为它们是与类关联的类变量。一切都访问相同的变量,包括每个实例。
没有。局部变量就是本地变量。它们可以是函数的本地函数,也可以是类声明的本地函数,不同而不是类变量。当类声明结束时,类声明中的本地超出范围。
那是因为他们完全相同 - 他们是全球性的。全球国家总是邪恶;这不是语言或环境的属性。也就是说,可能需要一些全局状态 - 这就是它的方式。当有全局状态时使用全局状态是有意义的。诀窍是正确使用全局状态 ,这有时是一项非常重要的工作。
这就是Ruby的方式。
Chris已经给了一个。
我会认为这个问题在很大程度上是自我回答的。当整个世界需要访问时全球化。实例,当它特定于类实例时。本地只在本地范围内需要时(例如,方法,块(注意块与范围之间的差异在1.8和1.9之间)等)变量不应该改变时的常量。一个类变量,它是每个实例都需要的东西,或者是通过类方法公开的东西,与类紧密相关的东西。
没有“大多数用例”,它完全取决于你对变量所做的事情。并且public
不是Java中事实上的选择 - 它取决于所讨论的实体。默认Java范围是package-private(方法,属性)。在Ruby中使用哪个完全取决于用例,注意到与Java一样,甚至更容易在Ruby中,事情可以被规避。
答案 1 :(得分:5)
局部变量不等于类1,它们与您所在的块相关联。块中声明的任何局部变量都可以在那里使用。类变量与您所在的类结构相关联。定义类本身就是一个块,因此您可以类似地访问局部变量,但是如果您在不同的上下文中引用您的类,则无法引用本地变量以同样的方式。
如果被滥用,全局变量被视为不良形式。 OOP应该帮助您构建程序,以便不需要整个程序的常量。把它们想象成实际上是全球化的:如果你不能保证它与整个世界的一致性,比如PI的价值或者你是否爱你的妻子,你可能不应该做出承诺。
一旦掌握了它们,我发现“Ruby Variable Scope”是一个很好的参考。
答案 2 :(得分:2)
我在以下链接中找到了关于Ruby中不同范围及其可见性的良好而深入的解释。Scopes and Visibilities with Examples in detail.
根据它,
Class variable (@@a_variable): Available from the class definition and any sub-classes. Not available from anywhere outside.
Instance variable (@a_variable): Available only within a specific object, across all methods in a class instance. Not available directly from class definitions.
Global variable ($a_variable): Available everywhere within your Ruby script.
Local variable (a_variable): It is available only in the particular method or block in ruby script.
有关实例变量的更多解释是:您可以在该特定类的任何方法中访问实例变量。虽然无法在方法之外访问局部变量。以下是红宝石僧侣的一个例子,它彻底解释了这个概念。
class Item
def initialize(item_name, quantity)
@item_name = item_name
@quantity = quantity
end
def show
puts @item_name
puts @quantity
supplier = "Acme corp"
puts supplier
end
end
Item.new("tv",1).show
这里的供应商是一个局部变量,只能在我们的例子中从show方法访问。只需尝试在initialize方法中声明供应商变量并在show方法中打印出来。它将作为未定义的变量供应商给出错误。
我希望它有所帮助。 :)
答案 3 :(得分:1)
Here is my two cents for this and is writing for c++/java/c# programmers:
A Ruby local/$Global variable is a bit like c++/java/c#'s local/Global variable.
A Ruby @instance variable it's like c++/java/c#'s member variable /class property which can be accessible in any member function/class method.Though Ruby instance can be applied not only to class but also to Ruby Module.
A Ruby @@class variable is like as c++/java's static member variable which is share between all instances of the same class.