在 Ruby 中格式化全名最简洁的方法是什么?



我想从titlefirst_namemiddle_namelast_name生成全名,例如比利·鲍勃·桑顿先生。但是titlemiddle_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

我将使用轨道,因此可以将我的.nil? || .empty?减少到.blank?以使最后一个更简洁,但我忍不住认为有更好的方法。

您正在使用 Rails,因此您可以访问String#squish

squish()

返回字符串,

首先删除字符串两端的所有空格,然后将剩余的连续空格组更改为每个空格。

所以你可以这样做:

name = "#{title} #{first_name} #{middle_name} #{last_name}".squish

你会寻找这样的东西吗?

[title, first_name, middle_name, last_name].compact.reject(&:empty?).join(' ')

带导轨

[title, first_name, middle_name, last_name].select(&:present?).join(' ')

查看 Ruby's String#squeeze and 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"

泛化到函数应该很容易。

[title, first_name, middle_name, last_name].select({|v| v.present?}).join(' ')

相关内容

最新更新