Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 数组到字符串的特定格式_Arrays_Ruby_String_Format - Fatal编程技术网

Arrays 数组到字符串的特定格式

Arrays 数组到字符串的特定格式,arrays,ruby,string,format,Arrays,Ruby,String,Format,我有这样一个杂凑: @password_constraints = { length: 'Must be at least 6 character long.', contain: [ 'one number', 'one lowercase letter', 'one uppercase letter.' ] } 我想写一个方法,返回一个人类可读的字符串,这个字符串由散列构建,如下所示: 长度必须至少为6个字符。必须包含:一个数字、一个小写字母

我有这样一个杂凑:

@password_constraints = {
  length: 'Must be at least 6 character long.',
  contain: [
      'one number',
      'one lowercase letter',
      'one uppercase letter.'
  ]
}
我想写一个方法,返回一个人类可读的字符串,这个字符串由散列构建,如下所示:

长度必须至少为6个字符。必须包含:一个数字、一个小写字母和一个大写字母

目前,我有一个非常详细的方法,每个
都有一个
,它迭代
@password\u约束[:contain]
数组,并有几个条件来检查是否必须放入
、或
或什么都不放

但是我想要的行为几乎与
join(',')
相同,但最后一个分隔符必须是

我正在寻找一种类似这样的解决方案,它具有特殊的
join

def password_constraints
  @password_constraints[:length] << ' Must contain.' << @password_constraints[:contain].join(', ') 
end
def密码\u约束
@密码约束[:length]在Ruby中是一个有趣的小速记技巧,你可以使用数组来避免冗长的
连接

def password_constraints
  @password_constraints[:length] << ' Must contain.' << @password_constraints[:contain] * ", "
end
def密码\u约束

@密码约束[:length]为了简洁起见,我会在这里使用一个猴子补丁(是的,我的
join\u要求
方法可能看起来更好一些)


您可以使用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"
def消息(约束)
*其他,倒数第二,倒数第二=约束[:包含]
second_last+=“和#{last}”,除非last.nil?

“#{constraints[:length]}必须包含:#{(其他人感谢你提供的信息,ruby内部有很多魔力!哈哈,这会引发错误,即使已修复,也不要在FinalTank中添加“and”,谢谢你提供此解决方案,我以前从未听说过猴子补丁。它工作得很好。问题是,在这个项目中,我只需要一种方法使用此行为。但在其他项目中如果“和问题”更常见,那么它将是最好的解决方案!再次感谢。虽然这样做有效,但它不会更紧凑,也不会像Ruby那样".@theTinMan这是公平的,我在回答中确实提到了这不是最佳的编写方式。我只是想提供猴子补丁作为解决方案。这绝对是一个更像Ruby的答案。为了清晰起见,最好使用splat操作符来提取最后一个元素,并使用字符串插值而不是串联。如果你真的想这样做的话如果你觉得有趣,你可以把输出字符串中插入代码的第二位改成
”#{(其他人是如此优雅且非常紧凑。这绝对是我想要的。非常感谢!我更新了解决方案:应该删除方法的第二行,它应该位于第三行的末尾,以便不修改当前哈希。
*其他人,second_last,last=约束[:contain]
”#{constraints[:length]}必须包含:#{(其他我不知道的问题…你可能应该针对这个新问题创建另一个问题。但是在此之前,如果你正在使用Rails,你要检查感谢你的帮助Doguita,我已经发现了问题。问题是我每次调用函数时都在修改哈希。哈哈。您好!
contain = ['one number','one lowercase letter','one uppercase letter.']
puts contain.join_requirements
# => one number, one lowercase letter, and one uppercase letter.
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"