您当前的位置: 首页 >  ruby

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

发布时间:2017-01-15 09:39:29 ,浏览量:0

我们需要生成一个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 命名参数特性简介

关注
打赏
1688896170
查看更多评论

暂无认证

  • 0浏览

    0关注

    107766博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0491s