ruby on rails, colon at back or front of variables

vdj4y picture vdj4y · Feb 5, 2015 · Viewed 14.6k times · Source

I am new to ruby , and rails both. I think Rails is one of the best API, and ruby is quite unique, it seems that ruby can cleverly do "assumptions" to help developer. But I am not too sure to what extend.

my questions is about colon in variable.
What i have understand so far is that :variable in ruby, is to say that this variable will not be able to change, which is similar to constant in other language. Am I correct??

Then my confusion is, sometimes i see the colon infront of variable, like this

 Rails.application.config.session_store :cookie_store, 
      key: '_blog_session'
  <%= link_to "Delete", article, confirm: "Are you sure?", 
      method: :delete %>

Both key: and method: has colon in front.What does that this represent? and Furthermore

Blog::Application.routes.draw.do
  root :to => "articles#index"
end

There are double colons inbetween variables? now I am guessing that Blog: is one variable, and :Application is constant. which i doubt it is, because it doesnt make sense. Please enlighten me?

thank you

Answer

Stefan picture Stefan · Feb 5, 2015

What i have understand so far is that :variable in ruby, is to say that this variable will not be able to change, which is similar to constant in other language.

I'm not sure if I understand that statement. In Ruby, constants start with an uppercase letter:

Foo = 1

Reassignment generates a warning:

Foo = 1
Foo = 2 #=> warning: already initialized constant Foo

Variables start with a lowercase letter and reassignment doesn't cause a warning (they are supposed to change):

foo = 1
foo = 2 # no warning

Symbols start with a colon:

:a_symbol
:Uppercase_symbol
:"i'm a symbol, too"

They often represent static values, e.g. :get and :post. Symbols are memory efficient, because they are created only once - the same symbol literal always returns the same object. Checking if two symbols are equal is a cheap operation.

Both key: and method: (...) What does that this represent?

This is an alternate syntax for hashes. You can type it in IRB to see the result:

{ foo: 1, bar: 2 }
#=> {:foo=>1, :bar=>2}

There are double colons inbetween variables? now I am guessing that Blog: is one variable, and :Application is constant.

No, Blog and Application are both constants and :: is the scope resolution operator. It can be used to access nested constants, e.g.:

module Foo
  class Bar
    BAZ = 123
  end
end

Foo::Bar::BAZ #=> 123