首頁  >  問答  >  主體

ruby-on-rails - ruby on rails中出现symbol使用的问题 急求大神解答

  class Books < ActiveRecord::Migration
  def self.up
     create_table :books do |t|
    t.column :title, :string, :limit => 32, :null => false
    t.column :price, :float
    t.column :subject_id, :integer
    t.column :description, :text
    t.column :created_at, :timestamp
     end
  end

  def self.down
    drop_table :books
  end
end

在上面rails迁移代码中:books是用符号代表参数吗? :title :price :string这些都是要干什么捏? 我知道ruby中的符号是用来替代字符串节省内存空间 可是这个情形下依然不知道是什么意思啊 求大神解答

<p class="row collapse">
  <p class="small-3 columns">
    <%= f.label :name, class: "right inline" %>
  </p>
  <p class="small-9 columns"><%= f.text_field :name %></p>
</p>
<p class="row collapse">
  <p class="small-3 columns">
    <%= f.label :price, class: "right inline", title: "Price in USD", data: {tooltip: true} %>
  </p>
  <p class="small-9 columns"><%= f.text_field :price %></p>
</p>
<p class="row collapse">
  <p class="small-9 small-offset-3 columns"><%= f.submit %></p>
</p>

还有在erb中也出现了ruby符号的奇怪用法 f.label :price 是要用:price 去代替f.label吗? 急求大神解答 纠结了几天了

高洛峰高洛峰2762 天前619

全部回覆(1)我來回復

  • 大家讲道理

    大家讲道理2017-04-21 11:18:35

    ruby中的:xxx表示一個symbol。

    你可以把symbol 理解 成 string,但是他們並不完全一樣。

    symbol是不變的。

    首先,ruby中的所有東西都是物件,每個物件都有一個唯一的object_id代表他在記憶體中的物理位置(但是不是直接存取就是這個物件的)。

    但是,有些東西是例外的,例如整數,你會發現,相同整數的object_id是相同的,這是ruby節約資源的一種做法。

    
    VALUE
    rb_obj_id(VALUE obj)
    {
    
       if (TYPE(obj) == T_SYMBOL) {
           return (SYM2ID(obj) * sizeof(RVALUE) + (4 << 2)) | FIXNUM_FLAG;
       }
       if (SPECIAL_CONST_P(obj)) {
           return LONG2NUM((long)obj);
       }
       return (VALUE)((long)obj|FIXNUM_FLAG);
    }
    

    這是ruby的實現,symbol和常數一樣,相同的symbol使用相同的object_id,也就是他們在記憶體當中的位置是一樣的。 ( 常數的object_id就直接反應了常數的值,在處理的時候也是特殊處理的)。

    至於上面的程式碼。 ruby當中函數呼叫的括號是可以省略的,例如 f.label :price 其實是 f.label( :price) 同時,hash的{}也是可以省略的,這就是你看的的:xxx=>xxx,xxx=>xxx或xxx:xxx,xxx:xxx,他們其實是{:xxx=>xxx,... }

    :price是他的一個參數而已。

    所以就出現了

     f.label :name, class: "right inline"
    

    這樣的程式碼, 他的意思是,

    f.label (:name, {:class => "right inline"})
    

    這樣,他就會創造一個label在form f下面,name是:name,而html標籤中的class是"right inline"。

    create_table :books do |t|
    

    do|x|...end沒有什麼特殊的意義和{|x|}一樣,只是代表一個block而已, 這個程式碼中是有迭代出現的,他其實是類似:

    File.open("xxx","xxx") do |f|
    f.write(...)
    end
    

    的,當然這樣也是合法的:

    File.open("xxx","xxx") { |f|
      f.write(...)
    }
    

    然後因為括號可以省略就變成上面的樣子了。

    對於ruby來說要實現這樣的功能,只需要:

    class Somethings
    #...  
      def create_table(name)
        # 为创建这个表做一些准备……
        # ...
        yield @table
        # 创建这个表
        # ...
      end
    end
    

    關於迭代器更具體的用法可以看看這個:http://blog.csdn.net/classwang/article/details/4692856

    回覆
    0
  • 取消回覆