1.
根据部分构建字符串
问题:要在某个数据结构上进行迭代,有次从中构建一个字符串
解决方案:
1) 从空字符串开始使用<<操作符重新向上追加字串:
hash = {“key” => ”vall”, “key2” => “val2”}
string = “”
hash.each{ |k,v| string << “#{k} is #{v}/n”}
2) String = “”
hash.each{ |k,v| string << k << “is” << v << “/n”
如果数据结构是数组或者被简单地转换为数组,那么使用Array#join通常会更高效:
puts hash.keys.join(“/n”) + “/n”
在
Java
和
Python
语言中,字符串是不可变的,构建字符串的方法是将字串放入一个数组或者另一个可变的数据结构中,它可以动态地扩展。但是
在
Ruby
中,字符串与数组一样是可变的。
Ruby对这一问题最快的解决方案通常是放弃现有的数组并将字串直接附加在一个基本字符串上。通常Array#join通常会更高效,但使用<<更易于理解。
@既然选择Ruby,还是用Ruby惯用的方法比较好,<<是C++和Java风格。
如果效率很重要,则str << ‘a’ + ‘b’ or str << “#{val1}” “#{val2}””的构造会产生立刻又被更大字符串包含的新字符串,效率低。可使用str << varl << ‘ ‘ << val2代替。
@记得调试时首先要定义str = ‘’,否则会出现未定义的变量或方法的Error。
!!Array#join与简单的数组上迭代构建字符串方法不同,它不在数组的最后一个元素后插入分隔符字符串。可以用Enumerable#each_with_index并忽略最后索引上的分隔符。当然,得知道确切长度。
S = ‘’
Data = {‘1’, ‘2’, ‘3’}
data.each_with_index { |x, i| s << x;s << “|” if i < data.length – 1}
2.
将变量带入字符串
问题:要创建一个包含Ruby变量或表达式表示的字符串。
解决方案:
在字符串中,变量或表达式被括进花括号并以hash字符为前缀:
Number = 5
“The number is #{number}.”
“The number is #{5}.”
”The number after #{number} is #{number.next}.”
任何以特殊标记#{}括起的文本都被理解为一个Ruby表达式,该表达式的结果被替代为要创建的字符串。
如果表达式的结果不是字符串,那么
Ruby
调用其
to_s
方法代替。
可以使用字符串插入来运行字符串内的大量Ruby代码。
%{Here is #{class InstantClass
def bar
“Some Bar”
end
end
InstantClass.new.bar
#写这个例子主要是为这一句,声明了一个实例
}.}
“here document”结构是%{}的另一种选择。
记得类的首字母要大些。
“I’ve set x to #{x = 5, x +=1.}”
=> “I’ve set x to 6.”
!!Ruby语言没有x++。