1

我想做'a' + 2 ='c',所以我写道:

('a'.ord + 2).chr

是的,我得到'c'。

但它看起来很多余。有没有更好的直接方法呢?使用 1.9.3

4

2 回答 2

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
于 2012-04-20T13:52:57.193 回答
0

没有一个普遍“更好”的方法来做到这一点(给定一些“更好”的随机定义;我的可能与你的不匹配)。这才是我真正的答案:做你正在做的事

然而,为了好玩,你可以做这个不通过整数土地的低效猴子补丁:

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"
于 2012-04-20T15:35:51.627 回答