Re: [问题] Rails 新手语法问题

楼主: aquarianboy (我是没牌的营养师!)   2015-03-04 14:54:00
※ 引述《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 当参数传进方法里,但又是另一种写法了)
以上,供大家参考 :)
作者: GinginDenSha (gingin)   2015-03-04 17:49:00
感谢补充
作者: beerson (啤酒僧)   2015-03-04 23:08:00
好文推~!
作者: dojay (dojay)   2015-03-23 20:09:00
推推推

Links booklink

Contact Us: admin [ a t ] ucptt.com