具有特定格式的数组到字符串
Array to String with specific format
我有这样的哈希:
@password_constraints = {
length: 'Must be at least 6 character long.',
contain: [
'one number',
'one lowercase letter',
'one uppercase letter.'
]
}
我想写一个方法,returns 一个从这个散列构建的人类可读的字符串,如下所示:
Must be at least 6 character long. Must contain: one number, one lowercase letter and an uppercase letter.
目前,我有一个非常冗长的方法,其中有一个 each
遍历 @password_constraints[:contain]
数组,并且有几个条件来检查我是否必须放置一个 ,
,或者一个and
或什么都没有。
但我想要与 join(', ')
几乎相同的行为,但最后的分隔符必须是 and
.
我正在寻找类似这种具有特殊 join
:
的解决方案
def password_constraints
@password_constraints[:length] << ' Must contain.' << @password_constraints[:contain].join(', ')
end
有没有办法让它更紧凑或更像 Ruby?
Here 是 Ruby 中的一个有趣的小 shorthand 技巧,您可以使用数组来消除对冗长 join
.[=17= 的需要]
def password_constraints
@password_constraints[:length] << ' Must contain.' << @password_constraints[:contain] * ", "
end
Array
class' *
运算符显式检查 string
第二个操作数,然后在幕后转换为调用 join
。
为了简洁,我会在这里使用猴子补丁(是的,我的 join_requirements
方法可能看起来更好一点)。
class Array
def join_requirements
result = ""
self.each do |requirement|
if requirement == self.last
result << "and " << requirement
else
result << requirement + ", "
end
end
result
end
end
然后在你的代码中你会看到这个:
contain = ['one number','one lowercase letter','one uppercase letter.']
puts contain.join_requirements
# => one number, one lowercase letter, and one uppercase letter.
您可以使用 splat 运算符拆分数组,如果只有一个字符串,则只检查大小写:
def message(constraints)
*others, second_last, last = constraints[:contain]
second_last += " and #{last}" unless last.nil?
"#{constraints[:length]} Must contain: #{(others << second_last).join(', ')}"
end
@password_constraints = {
length: 'Must be at least 6 character long.',
contain: [
'one number',
'one lowercase letter',
'one uppercase letter.'
]
}
message(@password_constraints)
# => "Must be at least 6 character long. Must contain: one number, one lowercase letter and one uppercase letter."
# if @password_constraints[:contain] = ['one lowercase letter', 'one uppercase letter.']
message(@password_constraints)
# => "Must be at least 6 character long. Must contain: one lowercase letter and one uppercase letter."
# if @password_constraints[:contain] = ['one lowercase letter']
message(@password_constraints)
# => "Must be at least 6 character long. Must contain: one lowercase letter"
我有这样的哈希:
@password_constraints = {
length: 'Must be at least 6 character long.',
contain: [
'one number',
'one lowercase letter',
'one uppercase letter.'
]
}
我想写一个方法,returns 一个从这个散列构建的人类可读的字符串,如下所示:
Must be at least 6 character long. Must contain: one number, one lowercase letter and an uppercase letter.
目前,我有一个非常冗长的方法,其中有一个 each
遍历 @password_constraints[:contain]
数组,并且有几个条件来检查我是否必须放置一个 ,
,或者一个and
或什么都没有。
但我想要与 join(', ')
几乎相同的行为,但最后的分隔符必须是 and
.
我正在寻找类似这种具有特殊 join
:
def password_constraints
@password_constraints[:length] << ' Must contain.' << @password_constraints[:contain].join(', ')
end
有没有办法让它更紧凑或更像 Ruby?
Here 是 Ruby 中的一个有趣的小 shorthand 技巧,您可以使用数组来消除对冗长 join
.[=17= 的需要]
def password_constraints
@password_constraints[:length] << ' Must contain.' << @password_constraints[:contain] * ", "
end
Array
class' *
运算符显式检查 string
第二个操作数,然后在幕后转换为调用 join
。
为了简洁,我会在这里使用猴子补丁(是的,我的 join_requirements
方法可能看起来更好一点)。
class Array
def join_requirements
result = ""
self.each do |requirement|
if requirement == self.last
result << "and " << requirement
else
result << requirement + ", "
end
end
result
end
end
然后在你的代码中你会看到这个:
contain = ['one number','one lowercase letter','one uppercase letter.']
puts contain.join_requirements
# => one number, one lowercase letter, and one uppercase letter.
您可以使用 splat 运算符拆分数组,如果只有一个字符串,则只检查大小写:
def message(constraints)
*others, second_last, last = constraints[:contain]
second_last += " and #{last}" unless last.nil?
"#{constraints[:length]} Must contain: #{(others << second_last).join(', ')}"
end
@password_constraints = {
length: 'Must be at least 6 character long.',
contain: [
'one number',
'one lowercase letter',
'one uppercase letter.'
]
}
message(@password_constraints)
# => "Must be at least 6 character long. Must contain: one number, one lowercase letter and one uppercase letter."
# if @password_constraints[:contain] = ['one lowercase letter', 'one uppercase letter.']
message(@password_constraints)
# => "Must be at least 6 character long. Must contain: one lowercase letter and one uppercase letter."
# if @password_constraints[:contain] = ['one lowercase letter']
message(@password_constraints)
# => "Must be at least 6 character long. Must contain: one lowercase letter"