Ruby方法参数默认值的一个小技巧在Rails中的应用

来源:互联网 发布:淘宝注销店铺重新开店 编辑:程序博客网 时间:2024/05/20 17:09

我们需要生成一个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    endend

第二种是参数默认值:

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 命名参数特性简介

0 0
原创粉丝点击