'a' + 2 = 'c' のようにしたいので、次のように書きました。
('a'.ord + 2).chr
はい、私は「c」を取得します。
しかし、それはとても冗長に見えます。それを行うためのより良い直接的な方法はありますか?1.9.3 の使用
'a' + 2 = 'c' のようにしたいので、次のように書きました。
('a'.ord + 2).chr
はい、私は「c」を取得します。
しかし、それはとても冗長に見えます。それを行うためのより良い直接的な方法はありますか?1.9.3 の使用
それを行うための非常に悪い方法は、次のようになります。
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
それを行う普遍的な「より良い」方法はありません(「より良い」のランダムな定義が与えられた場合、私のものはあなたのものと一致しない場合があります)。それが私の本当の答えです。あなたがしていることをしてください。
ただし、楽しみのために、整数ランドをステップスルーしないこの非効率的なモンキーパッチを実行できます。
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"
1 つの文字 (「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"