2013-08-01 53 views
4

我有一個字符串,它是一個字符長,可以是任何可能的字符值:如何在Ruby中爲所有可能的值增加/減少字符?

irb(main):001:0> "\x0" 
=> "\u0000" 

我想這可能工作:

irb(main):002:0> "\x0" += 1 
SyntaxError: (irb):2: syntax error, unexpected tOP_ASGN, expecting $end 
"\x0" += 1 
     ^   from /opt/rh/ruby193/root/usr/bin/irb:12:in `<main>' 

但是,正如你所看到的,它沒有。我如何增加/減少我的角色?


編輯:

紅寶石似乎並沒有被設置爲做到這一點。也許我正在接近這個錯誤的方式。我想根據8位塊操縱原始數據。我怎樣才能最好地完成這種操作?

+0

是的,你不能做+1,它是下一個或succ。要麼 !變量。 –

+0

哦,我想我不能分配給字符串文字(或者他們稱之爲紅寶石) – anthropomorphic

+0

@ShawnBalestracci實際上也不起作用。 – anthropomorphic

回答

15

根據可能的值是什麼,你可以使用String#next

"\x0".next 
# => "\u0001" 

或者更新現有的值:

c = "\x0" 
c.next! 

這很可能不是你想要什麼:

"z".next 
# => "aa" 

我想到的最簡單的方法是增加角色的底層代碼NT是這樣的:

c = 'z' 
c = c.ord.next.chr 
# => "{" 

遞減稍微複雜一些:

c = (c.ord - 1).chr 
# => "z" 

在這兩種情況下,還有,你不會一步之外的0..255的假設;您可能需要爲此添加檢查。

+0

對於所有可能的值,怎麼辦?有沒有一種方法總是增加角色的二進制值?如果我用'「\ x0」'開頭並且調用了'#next'足夠多的次數,我最終會用'z'',然後我再次調用'#next'會給我''aa'''。我如何避免這種情況? – anthropomorphic

+0

另外,我如何減少?作爲獎勵,我該如何增加或減少某個數值? – anthropomorphic

+0

@anthropomorphic我已經更新了我的答案。增加或減少一定量將是我如何演示遞減的簡單變體。 –

0

您可以使用String#next方法。

+3

而不是單個句子的建議,你應該添加一個例子來說明爲什麼這是一個很好的答案。 –

+0

感謝您的幫助,我還是個新手。我會改善我的迴應。 –

2

你不能做:

"\x0" += 1 

因爲,在Ruby中,這是短期的:

"\x0" = "\x0" + 1 

,這是一個語法錯誤值分配給一個字符串。

但是,給定一個整數n,可以使用pack將其轉換爲字符。例如,

[97].pack 'U' # => "a" 

同樣,您可以使用ord將字符轉換爲整數。例如:

[300].pack('U').ord # => 300 

使用這些方法,你可以很容易地編寫自己的增值功能,如下所示:

def step(c, delta=1) 
    [c.ord + delta].pack 'U' 
end 

def increment(c) 
    step c, 1 
end 

def decrement(c) 
    step c, -1 
end 

如果你只是想操縱字節,可以使用String#bytes,它會給你要玩的整數數組。您可以使用Array#pack將這些字節轉換回字符串。 (參考文檔編碼選項。)

0

我覺得最優雅的方法(字母數字字符)將是:

"a".tr('0-9a-z','1-9a-z0') 

這將通過對Z和通過的數量和迴圈的一。

我重讀了這個問題,看到我的答案與問題無關。我無法直接處理8位值。

相關問題