Re: [問題] Rails 新手語法問題
※ 引述《GinginDenSha (gingin)》之銘言:
: 在 migration 中,
: 使用 create_table 時
: 通常會寫成
: create_table :table_name do |t|
: end
: create_table 的 signature 為
: create_table(table_name, options = {})
: 有 table_name 及 options 兩個 parameters
: 為什麼不是寫成
: create_table :table_name, do |t|
: end
: 這樣子呢? (兩個parameters 所以用 , 隔開)
: 還是說以 block 為 parameter 時,可以不用使用 ,
: 希望各位大大解惑
: 謝謝
補充幾件事:
一、在 Ruby 的方法呼叫可適時忽略小括號。
二、在 Ruby 的方法,如果最後一個參數是 hash,它的大括號可以省略。
三、接在方法後面的 block 本身並不是參數。
一、省略小括號
舉個例子來說:
5.times { ... }
它的原形其實是:
5.times() { ... }
只是小括號被省略了
二、省略大括號
在 rails 裡相信大家都用過 link_to 這個 view helper:
link_to "Hello", root_path, class: 'btn btn-default', method: :post
這段程式看起來好像有 4 個參數,但事實上只有 3 個
因為它的原形是:
link_to("Hello", root_path, {class: 'btn btn-default', method: :post})
最後的參數是一個 hash,常被省略大括號
三、block 本身並不是參數
def greeting
yield
end
greeting { puts "hello" }
後面那段 block 其實並不是直接傳進 greeting 的參數
而是在 greeting 裡的那個 yield 把程式的控制權暫時的交出來給跟在外面的 block
待 block 執行完之後再取回控制權,然後繼續往下執行..
但,萬一 greeting 方法沒傳 block 給它,它就會出現 LocalJumpError 的錯誤
所以通常會再檢查看看是不是有 block 傳進來,有的話再 yield
def greeting
yield if block_given?
end
(其實也是可以把 block 當參數傳進方法裡,但又是另一種寫法了)
以上,供大家參考 :)
--
http://blog.eddie.com.tw/
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.61.216.119
※ 文章網址: https://www.ptt.cc/bbs/Ruby/M.1425452043.A.2DB.html
推
03/04 17:49, , 1F
03/04 17:49, 1F
推
03/04 23:08, , 2F
03/04 23:08, 2F
推
03/12 02:43, , 3F
03/12 02:43, 3F
推
03/23 20:09, , 4F
03/23 20:09, 4F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章