首頁  >  問答  >  主體

ruby-on-rails - ruby中do关键字的用法

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
create_table :books do |t|

这一句 没有迭代操作 为什么会有 ruby do |t|这句呢 这里的 ruby do |t|到底是什么意思? 求高人解答

PHP中文网PHP中文网2762 天前1065

全部回覆(3)我來回復

  • 伊谢尔伦

    伊谢尔伦2017-04-21 11:18:31

    create_table :books do |t|
    

    不是迭代而是回調。

    關於Ruby的回呼:
    http://stackoverflow.com/questions/1677861/how-to-implement-a-callback-in-ruby

    關於Rails的Migration:
    http://guides.rubyonrails.org/migrations.html

    如果你用jQuery做過Ajax的話,應該有類似這樣的經驗:

    $.get("test.php", function(data){ alert("Data Loaded: " + data); 
    

    $.get()方法的回傳值是test.php的response body,第一個參數是請求的url,第二個參數就是回調函數,這個函數接受test.php的response body作為參數data的值,並且透過彈窗顯示。

    這條Migration語句你可以這麼理解。

    # 创建了一个名为books的表
    create_table :books do |t| # t是create_table方法的返回值
        t.column :title, :string, :limit => 32, :null => false # 创建一个列title,字符串,最大长度32,不为null
        t.column :price, :float # 创建一个列price,浮点型
        t.column :subject_id, :integer # 创建一个列subject_id,整形
        t.column :description, :text # 创建一个列description,文本
        t.column :created_at, :timestamp # 创建一个列created_at,时间戳
    end
    

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-21 11:18:31

    在這裡:/q/1010000000266437 已經回過一遍了,再搬過來。

    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
  • 大家讲道理

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

    do ... end 等價於{ ... },是一個block,ruby方法可以接block參數

    回覆
    0
  • 取消回覆