【问题标题】:@ variables in Ruby on Rails@Ruby on Rails 中的变量
【发布时间】:2012-12-28 11:11:18
【问题描述】:

@titletitle 有什么区别?因为它们都可以是变量名。另外,我如何决定应该使用哪种变量?是否使用@

【问题讨论】:

标签: ruby-on-rails ruby variables


【解决方案1】:

title 是一个局部变量。它们只存在于其范围内(当前块)

@title 是一个实例变量 - 可用于类中的所有方法。

您可以在此处阅读更多内容: http://strugglingwithruby.blogspot.dk/2010/03/variables.html

在 Ruby on Rails 中 - 将控制器中的变量声明为实例变量 (@title) 使它们可用于您的视图。

【讨论】:

  • 感谢您的回答,有后续问题...在我正在处理的一个类中,成员变量最初的构造类似于@options = {...}。但是,在此之后,类中的方法访问并使用该变量进行函数调用,就好像它是本地的一样(即“options.merge()”)。这只是糟糕的形式吗?是否还有其他语法魔术? (即喜欢对变量进行静默复制,或将其设为“常量”以使其无法修改等)?我是从 C/C++ 和 Java 的角度来的,真正模糊和可选的语法让我抓狂!
  • 您的班级是否定义了一个与@DanDevine 同名的 attr_accessor? attr_accessor 是为您生成 getter\setter 的语法糖。如果您在没有@ 符号的情况下获取值,则代码将接收变量,因为它正在调用 getter。请注意,这不起作用,如果您要设置 var,则需要显式使用 @ 符号,否则您只需设置本地 var。这是好风格吗?很难说。我更喜欢在我的方法中使用 getter 语法,以防 getter 被覆盖 - 我喜欢尊重这种封装,即使在类本身内也是如此。 YMMV
【解决方案2】:

当您希望变量在视图中可用时,请在控制器中使用 @title

解释是@title是一个实例变量,而title是一个局部变量。 Rails 使来自控制器的实例变量对视图可用,因为模板代码(erb、haml 等)在当前控制器实例的范围内执行。

【讨论】:

  • 谢谢!这是解释为什么控制器类中定义的@variables 可以被视图中的代码拾取的唯一答案。
【解决方案3】:

一个关于What is Variable Scope?的教程很好地介绍了一些细节,这里只是附上相关的。


+------------------+----------------------+
| Name Begins With |    Variable Scope    |
+------------------+----------------------+
| $                | A global variable    |
| @                | An instance variable |
| [a-z] or _       | A local variable     |
| [A-Z]            | A constant           |
| @@               | A class variable     |
+------------------+----------------------+

【讨论】:

    【解决方案4】:

    区别在于变量的范围。 @version 可用于类实例的所有方法。

    简短的回答,如果您在控制器中并且需要使变量可用于视图,请使用@variable

    要获得更长的答案,试试这个:http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html

    【讨论】:

      【解决方案5】:

      @variables 在 ruby​​ 中被称为实例变量。这意味着您可以在类内的任何方法中访问这些变量。 [跨类中的所有方法]

      没有@ 符号的变量称为局部变量,这意味着您只能在THAT DECLARED METHOD 中访问这些局部变量。仅限于本地范围。

      实例变量示例:

      class Customer
        def initialize(id, name, addr)
          @cust_id = id
          @cust_name = name
          @cust_addr = addr
        end
      
        def display_details
          puts "Customer id #{@cust_id}"
          puts "Customer name #{@cust_name}"
          puts "Customer address #{@cust_addr}"
        end
      end
      

      在上面的示例中,@cust_id@cust_name@cust_addr 在类中的另一个方法中被访问。但是使用局部变量将无法访问相同的内容。

      【讨论】:

        【解决方案6】:

        局部变量只能从它的初始化块中访问。此外,局部变量以小写字母 (a-z) 或下划线 (_) 开头。

        实例变量是self 的一个实例,并以@ 开头。实例变量也属于对象本身。实例变量是您执行方法的变量,例如 .send

        示例:

        @user = User.all
        

        @user 是实例变量

        并且未初始化的实例变量的值为Nil

        【讨论】:

        • 那么这如何解释@titletitle之间的区别?
        • 使用像@title这样的实例变量,您可以对其执行各种方法,而您不能使用局部变量
        • 那么这实际上是如何解决这个问题的呢?看起来你只是在引用一些教程。 OP想知道他应该使用@title还是title
        • 因此,如果他们想要执行任何方法,例如,他们应该使用实例变量。 def new 或 def create 等
        • 没有什么能阻止你做 user = User.all 并对用户执行方法,但这不是重点。
        【解决方案7】:

        @变量是实例变量,没有是局部变量。

        阅读更多http://ruby.about.com/od/variables/a/Instance-Variables.htm

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-24
          • 2013-02-21
          • 1970-01-01
          • 2017-01-26
          • 2017-10-11
          • 1970-01-01
          • 1970-01-01
          • 2013-07-05
          相关资源
          最近更新 更多