我想做'a'+ 2 ='c',所以我写道:
('a'.ord + 2).chr
是的,我得到'c'。
但它看起来如此多余。有没有更好的直接方式呢?使用1.9.3
答案 0 :(得分:4)
真的,非常糟糕的方式就是这样:
class String
alias_method :original_plus, :+
def +(other)
if self.length == 1 and other.is_a?(Fixnum)
(self.ord + other).chr
else
original_plus(other)
end
end
end
puts 'a' + 2
=> c
答案 1 :(得分:0)
没有一种普遍“更好”的方法(给出一些随机的“更好”的定义;我的可能与你的不相符)。这是我的真实答案:做你正在做的事。
但是,为了好玩,您可以执行效率低下的 monkeypatch,它不会跨越整数范围:
class String
alias_method :__succ,:succ
def succ(steps=nil)
steps ? dup.tap{ |c| steps.times{ c.succ! } } : __succ
end
end
puts "a".succ(2) #=> "c"
然而,这可能有不良的副作用:
p [24,25,26,27].map{ |s| "a".succ(s) }
#=> ["y", "z", "aa", "ab"]
如果需要使用相同的偏移量来抵消许多ASCII字符:
p "hello".bytes.map{ |c| c+3 }.pack( "c*" ) #=> "khoor"
如果您需要通过相同的偏移计算单个字符(如“a”)ASCII字符的许多偏移量:
A = "a".ord
p [1,2,3,7,20,25].map{ |n| A+n }.pack( "c*" ) #=> "bcdhuz"
如果您需要从各种角色计算许多偏移量:
chars = "hello"
offsets = [15,10,6,0,-11]
puts chars.bytes.zip(offsets).map{|a,b| a+b }.pack( "c*" )
#=> "world"