ruby中各种变量范围之间的差异
Ruby有5个变量范围:
- 局部变量 :这些是正常变量,例如
x = 25
,y = gaurish
,其中x
和y
是局部变量。 - 实例变量 :这些用实际变量名称的
@
符号表示。 主要用于类,以便类的每个实例/对象具有不同/单独的值。 例。@employee.name = 'Alex'
- 类变量 :在变量名前面用
@@
符号表示。 类变量,我认为具有相同的值accos所有实例/对象。 - 全局变量 :它们以
$
符号开头, 随处可访问。 示例$LOAD_PATH
- 常量 :必须以大写字母开头,但必须按照
ALL_CAPS
的惯例ALL_CAPS
。 虽然,它是一个常数,但它的值不是常数,可以改变(虽然ruby会发出警告)。 从某种意义上说,这也像一个变量。
正如您可能注意到的,以上所有都是存储某些类型值的变量,它们的值可以更改。 但是,每个范围都会有所不同。 拥有5种不同类型的可变范围让我感到困惑。 主要是,我很难决定在什么情况下,我应该在我的代码中使用特定的范围。 所以我脑子里有一些问题。 请回答:
- 我注意到,与实例变量不同,局部变量和类变量对于所有对象/实例保持相同。 那么局部变量和类变量有什么区别?
- 可以使用局部变量代替类变量吗? 或相反亦然。 如果是,那么为什么,如果没有,那么为什么不呢?
- ruby中的全局变量让我想起了PHP中邪恶的
global $x
变量。 ruby中的全局变量也被认为是邪恶的,因此不应该使用。 或者,在特定情况下,在ruby中使用全局变量是有意义的吗? - 为什么常量不是常量并允许更改它们的值? 根据定义,常数的值应该是不变的吗? 否则,我们可以使用另一个变量而不改变它的值。 那相当于ruby中的CONSTANT吗?
- 任何页面/资源/链接解释了ruby中5个不同变量范围之间的区别? 我想保留一个方便参考。
- 在什么用例下,我应该在我的代码中使用特定的变量作用域。 因此,人们会解释所有5个案例,这些案例很酷,这是我混淆的主要原因。
- 在java中有像
public
这样的事实上的选择吗? 在大多数用例中哪个是安全的赌注?
感谢您花时间阅读并回答问题
-
类变量对于所有实例都是相同的,因为它们是与类关联的类变量。 一切都访问相同的变量,包括每个实例。
-
不。局部变量就是本地变量。 它们可以是函数的本地函数,也可以是类声明的本地函数,它与类变量不同。 类声明结束时,类声明中的本地超出范围。
-
那是因为他们完全一样 – 他们是全球性的。 全球国家总是邪恶的; 这不是语言或环境的属性。 也就是说,可能需要一些全球状态 – 这就是它的方式。 当有全局状态时使用全局状态是有意义的。 诀窍是正确使用全球状态,这有时是一项非平凡的努力。
-
这就是Ruby的方式。
-
克里斯已经给了一个。
-
我认为这个问题在很大程度上是自我回答的。 当整个世界需要访问时全球化。 实例,当它特定于类实例时。 本地只在本地范围内需要时(例如,方法,块(注意块与范围之间的差异在1.8和1.9之间)等)变量不应该改变时的常量。 一个类变量,它是每个实例都需要的东西,或者是通过类方法公开的东西,与类紧密相关的东西。
-
没有“大多数用例”,它完全取决于你对变量所做的事情。
public
不是Java中事实上的选择 – 它取决于所讨论的实体。 默认Java范围是package-private(方法,属性)。 在Ruby中使用哪个完全取决于用例,注意到与Java一样,甚至更容易在Ruby中,事情可以被规避。
局部变量不等于类1,它们与您所在的块相关联。块中声明的任何局部都可以在那里使用。 类变量与您所在的类结构相关联。定义类本身就是一个块,因此您可以类似地访问局部变量,但是如果您在不同的上下文中引用您的类,则无法引用本地变量以相同的方式。
如果被滥用,全局变量被认为是不良forms。 OOP应该帮助您构建程序,以便不需要整个程序的常量。 把它们想象成实际上是全球性的:如果你不能保证它与整个世界的一致性,比如PI的价值或者你是否爱你的妻子,你可能不应该做出承诺。
一旦掌握了它们,我发现“ Ruby Variable Scope ”是一个很好的参考。
我在以下链接中找到了关于Ruby中不同范围及其可见性的良好而深入的解释。 范围和可见性与示例详细。
根据它,
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.
有关实例变量的更多解释是:您可以在该特定类的任何方法中访问实例变量。 虽然无法在方法之外访问局部变量。 以下是ruby僧侣的一个例子,它彻底解释了这个概念。
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方法中打印出来。 它将作为未定义的变量供应商给出错误。
我希望它有所帮助。 🙂
这是我的两分钱,正在为c ++ / java / c#程序员写作:
Ruby local / $ Global变量有点像c ++ / java / c#的local / Global变量。
Ruby @instance变量就像c ++ / java / c#的成员变量/类属性一样,可以在任何成员函数/类方法中访问。虽然Ruby实例不仅可以应用于类,还可以应用于Ruby模块。
Ruby @@类变量类似于c ++ / java的静态成员变量,它在同一个类的所有实例之间共享。