作者aquarianboy (高 见龙)
看板Ruby
标题Re: [问题] Rails 新手语法问题
时间Wed Mar 4 14:54:00 2015
※ 引述《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://webptt.com/cn.aspx?n=bbs/Ruby/M.1425452043.A.2DB.html
1F:推 GinginDenSha: 感谢补充 03/04 17:49
2F:推 beerson: 好文推~! 03/04 23:08
3F:推 Mtcat: 03/12 02:43
4F:推 dojay: 推推推 03/23 20:09