我们需要生成一个gravatar格式的html.image标示,于是写了如下方法:
def gravatar_for(user) gravatar_id = Digest::MD5::hexdigest(user.email.downcase) gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}" image_tag(gravatar_url, alt: user.name, class: "gravatar") end
但是现在我们需要在生成image标示时可以定制图片大小,这里有几种方法,首先是用可选参数:
def gravatar_for(user,*args) size = args.first unless size.nil? //do some work end end
第二种是参数默认值:
def gravatar_for(user,size=40) end
但这里有一个问题,如果调用时未给size输入值,我们不希望使用40,而是gravatar_far逻辑不变.这里的关键是如何判断用户是否给size输入了值,我们不能仅仅 if size == 40,因为用户可能以40调用size.因为ruby的”最后表达式定值”的特性,我们可以这样写:
def gravatar_for(user,size=(flag=true,40)) gravatar_id = Digest::MD5::hexdigest(user.email.downcase) gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}" unless flag.nil? image_tag(gravatar_url, alt: user.name, class: "gravatar") else image_tag(gravatar_url, alt: user.name, class: "gravatar",size:size.to_s) end end
如果用户未指定size默认值,那么flag一定为nil,否则为true.
最后一种方式是使用hash,你大概不希望调用 gravatar_tag(user,120)时搞不清120表示的是神马!?所以你希望像swift语言那样带参数名称去调用,不过这里用hash来模拟也是绰绰有余了:
def gravatar_for(user,hash) size = hash[:size] //do some work... end
现在你可以这样调用了:
gravatar_for(user,size:100)
PS:ruby 2.x的命名参数特性我特地新开一篇blog介绍,请猛戳以下链接:
Ruby 2.x 命名参数特性简介