2010-10-19 86 views
0

我想使用的代码名称为“李四-SMITH”到“李四史密斯”转换内部红宝石分配 为什么x.capitalize!有效果而x =“foo”没有?
有没有更好的方法来做到这一点?一个迭代

回答

0

如何

cap_name = name.split.map{|w| w.split("-").map(&:capitalize).join("-") }.join(" ") 
1

x = "foo"只是分配变量x来引用不同的对象。由于该变量只存在于该块中,因此没有可观察的效果。它根本不会改变字符串。另一方面,x.capitalize!capitalize!消息发送到字符串,从而导致它改变大小写。

0

因为x是一个局部变量,它指向使用相同数据的字符串。这就是为什么影响新值的原因在字符串内不会改变。

您可能想在这里重新思考一下您的策略;它依赖于拆分字符串与原始字符串指向相同的内存区域这一事实,在所有情况下我都不打赌。
我建议,而不是使用.MAP:

name_split = name.split(/\s/).map do |x| 
    if x =~ /-/ 
    name1, name2 = x.split(/-/) 
    name1.capitalize + "-" + name2.capitalize 
    else 
    x.capitalize 
    end 
end 
puts name_split.join(" ") 

或者,如果你觉得这个更具可读性:

name_split = name.split(/\s/).map do |x| 
    x.split(/-/).map(&:capitalize).join('-') 
end 
puts name_split.join(" ")