ruby on rails,冒号后面或前面的变量

vdj*_*j4y 17 ruby variables ruby-on-rails constants colon

我是ruby的新手,并且两者兼而有之.我认为Rails是最好的API之一,而且ruby非常独特,似乎ruby可以巧妙地做"假设"来帮助开发人员.但我不太确定会延伸到什么程度.

我的问题是变量中的冒号.
到目前为止我所理解的是: ruby中的变量,就是说这个变量将无法改变,这与其他语言中的常量相似.我对么??

然后我的困惑是,有时我看到变量前面的冒号,像这样

 Rails.application.config.session_store :cookie_store, 
      key: '_blog_session'
  <%= link_to "Delete", article, confirm: "Are you sure?", 
      method: :delete %>
Run Code Online (Sandbox Code Playgroud)

这两个关键:方法:已结肠front.What确实,这代表什么?而且

Blog::Application.routes.draw.do
  root :to => "articles#index"
end
Run Code Online (Sandbox Code Playgroud)

变量之间有双冒号?现在我猜测Blog:是一个变量,而且:应用程序是不变的.我怀疑它是什么,因为它没有意义.请赐教?

谢谢

Ste*_*fan 47

到目前为止我所理解的是,:variable在ruby中,就是说这个变量将无法改变,这与其他语言中的常量相似.

我不确定我是否理解这一说法.在Ruby中,常量以大写字母开头:

Foo = 1
Run Code Online (Sandbox Code Playgroud)

重新分配会生成警告:

Foo = 1
Foo = 2 #=> warning: already initialized constant Foo
Run Code Online (Sandbox Code Playgroud)

变量以小写字母开头,重新分配不会引发警告(它们应该更改):

foo = 1
foo = 2 # no warning
Run Code Online (Sandbox Code Playgroud)

符号以冒号开头:

:a_symbol
:Uppercase_symbol
:"i'm a symbol, too"
Run Code Online (Sandbox Code Playgroud)

它们通常代表静态值,例如:get:post.符号是内存有效的,因为它们只创建一次 - 相同的符号文字总是返回相同的对象.检查两个符号是否相等是一种廉价的操作.

两者key:method:(......)这代表什么?

这是哈希的替代语法.您可以在IRB中键入它以查看结果:

{ foo: 1, bar: 2 }
#=> {:foo=>1, :bar=>2}
Run Code Online (Sandbox Code Playgroud)

变量之间有双冒号?现在我猜这Blog:是一个变量,并且:Application是不变的.

不,Blog并且Application都是常量,并且::是范围解析运算符.它可用于访问嵌套常量,例如:

module Foo
  class Bar
    BAZ = 123
  end
end

Foo::Bar::BAZ #=> 123
Run Code Online (Sandbox Code Playgroud)


wpp*_*wpp 6

Rails.application.config.session_store :cookie_store, key: '_blog_session'
Run Code Online (Sandbox Code Playgroud)

session_store 是一个采用两个"参数"的方法:

  • :cookie_store是一个符号
  • key: '_blog_session'实际上是编写哈希的简短方法.

(也可能session_store :cookie_store, { key: '_blog_session' })

同样的 link_to "Delete", article, confirm: "Are you sure?", method: :delete

  • "Delete" 是一个字符串
  • article 一个变量
  • { confirm: '...', method: :delete }散列结果,其中confirm:,method::delete再次是符号.

Blog::Application ::基本上是命名空间解析运算符.一种在Blog模块中处理Application类的方法.

希望这可以帮助.看看我引用的文档,它的解释相当不错.

  • `confirm: "Are you certain?", method: :delete` 是*一个*哈希,而不是两个 (2认同)