Ruby on Rails- :symbols、@iVars 和“字符串”——哦,天哪!

Posted

技术标签:

【中文标题】Ruby on Rails- :symbols、@iVars 和“字符串”——哦,天哪!【英文标题】:Ruby on Rails- :symbols, @iVars and "strings" - oh my! 【发布时间】:2011-03-01 07:16:10 【问题描述】:

刚接触 Rails,想弄清楚何时/为什么在框架内使用 :symbols@ivars"strings"

我想我从概念上理解它们之间的区别

每个项目只有一个 :symbol 实例 每个实例一个 @ivar 多个"strings" - 因为它们在被引用时被创建(?)

欢迎指正!

主要的困惑来自于理解 Rails 期望的规则约定——在哪里以及为什么?

我敢肯定有一个“啊哈!”时刻即将到来,但我还没有……因为这对我来说似乎很随意(来自 C/Obj-C)。

-谢谢

【问题讨论】:

【参考方案1】:

@instance_variable 是一个实例变量。它通常在控制器中定义并在视图中访问。

"string" 是一个字符串,就像在任何其他语言中一样。

:symbol,正如您所提到的,它是一种表示名称和字符串的有效方式;它们是文字值。它在 ruby​​ 会话期间被初始化并且只存在一次。它不是字符串,因为您无权访问 String 方法;这是一个符号。最重要的是,它是不可变的。由于这些原因,它在表示散列中的键时变得非常方便。 Rails 方法使用哈希,因此,您在 Rails 中到处都可以找到符号。

【讨论】:

啊,哈希和:symbols 之间的关系是有道理的(+1)。仍然我似乎看到字符串、符号和 ivars 在某种程度上可以互换地传递给方法?!?也许随着我的工作,模式会变得清晰......【参考方案2】:

实例变量非常简单:它们跟踪特定实例的属性/值,因此您可以在值因实例而异时使用它们。

符号与字符串比较随意。符号通常用于 constant 值,与 C 等语言使用枚举的方式非常相似; Ruby 没有枚举,所以经常使用符号来填补这个空白。字符串用于更多不同的文本片段,它们不会用作标志或类似的常量。

【讨论】:

【参考方案3】:

符号有点像指针(不是 C-ish 的方式,而是 C-ish 的思维方式,它们指向)。好吧,您在操作属性时使用符号。如果你问我,它们是动态类型的一大好处。 (对于潜在的选民,我没有任何伤害的意思,我知道他们不是指针,但对我来说感觉是“啊哈!”)。

:action => "index"

当您从模型中获取数据并希望在您的视图中(在您的控制器方法内)使用它们时,需要实例变量。

def my_controller_method
@myposts = Post.find(:all)
end

# inside view
<% for @myposts do |m| %>
<i><%= m.title %></i>
<% end %>

请注意,每个版本的规则和约定都发生了很大变化(正如我在 Rails 之旅中发现的那样)。拥有正确的导轨和正确的 Rails 会有所帮助。祝你编码好运!

【讨论】:

在 freenode 上加入#rubyonrails 有很大帮助,它确实帮助我更快地了解 Rails。【参考方案4】:

实例变量与字符串和符号并不真正属于同一个列表。字符串和符号是类的类型,而实例变量是变量的类型。所以实例变量(@var)只是在一个类的一个实例的方法之间存储值的一种方式:

class Calculator
  @counter = 0

  def inc
    @counter += 1
  end

  def dec
    @counter -= 1
  end
end

Here 是一篇关于符号和字符串区别的好文章。

【讨论】:

【参考方案5】:

Rails控制器通过ORM(Object Relation Mapping)的Models访问rails数据库,即Model类会映射到其对应的表中,Objects直接映射到表中的行。为了得到给定用户查询的结果,实例变量(@instance_variable)是处理它的完美选择。

【讨论】:

这个答案和问题有什么关系?

以上是关于Ruby on Rails- :symbols、@iVars 和“字符串”——哦,天哪!的主要内容,如果未能解决你的问题,请参考以下文章

ruby on rails如何安装

ruby on rails - 问题捆绑安装nokogiri 1.7.2 on ruby on rails 4.x.

Ruby on Rails入门篇

markdown [rails:devise] Ruby on Rails的身份验证gem。 #ruby #rails

ruby Ruby on Rails:常见路由

ruby Ruby on rails类