我想从title
,first_name
,middle_name
和last_name
生成全名。例如比利鲍勃桑顿先生。但title
和middle_name
是可选的,我不想获得任何前导或双重空格。我想出了很多方法,但没有一个看起来很优雅。到目前为止,这是我的技术
full_name = "#{title} #{first_name} #{middle_name} #{last_name}"
#FAIL. Leading and double spaces result
full_name = "#{title} #{first_name} #{middle_name} #{last_name}".gsub(/^ /,'').gsub(/ /,' ')
#Works but all that regex tacked on the end is very ugly
full_name = "#{title}#{title.nil? || title.empty? ? '' : ' '}#{first_name} #{middle_name}#{middle_name.nil? || middle_name.empty? ? '' : ' '}#{last_name}"
#Works but goes on forever
我将使用rails,因此可以将.nil? || .empty?
缩减为.blank?
,使最后一个更简洁,但我不禁认为有更好的方式。
答案 0 :(得分:8)
您正在使用Rails,因此您可以访问String#squish
:
<强>挤气()强>
返回字符串,首先删除字符串两端的所有空格,然后将剩余的连续空白组分别更改为一个空格。
所以你可以这样做:
name = "#{title} #{first_name} #{middle_name} #{last_name}".squish
答案 1 :(得分:2)
查看Ruby的String#squeeze和String#strip
>> title=""
=> ""
>> first_name="Alice"
=> "Alice"
>> middle_name=""
=> ""
>> last_name=""
=> ""
>> full_name = "#{title} #{first_name} #{middle_name} #{last_name}".squeeze(" ").strip
=> "Alice"
>> last_name="Wu"
=> "Wu"
>> full_name = "#{title} #{first_name} #{middle_name} #{last_name}".squeeze(" ").strip
=> "Alice Wu"
对函数进行泛化应该非常简单。
答案 2 :(得分:2)
你会找这样的东西吗?
[title, first_name, middle_name, last_name].compact.reject(&:empty?).join(' ')
使用Rails
[title, first_name, middle_name, last_name].select(&:present?).join(' ')
答案 3 :(得分:0)
[title, first_name, middle_name, last_name].select({|v| v.present?}).join(' ')