在许多语言中都有一对函数chr()ord(),它们在数字和字符值之间进行转换。在某些语言中,asc()称为Integer#chr

Ruby有const,效果很好:

>> 65.chr
A

足够公平。但你怎么走另一条路呢?

"A".each_byte do |byte|
   puts byte
end

打印:

65

这与我想要的非常接近。但我真的宁愿避免循环 - 我正在寻找一些足够短的东西,以便在声明<=>时可读。

有帮助吗?

解决方案

如果1.9中不存在String#ord,则它在2.0中存在:

"A".ord #=> 65

其他提示

在Ruby(包括1.8系列)中,以下内容将产生65(对于ASCII):

puts ?A
'A'[0]

Ruby 1.9中的行为发生了变化,上述两种情况都会产生<!>“A <!>”;代替。在Ruby 1.9中执行此操作的正确方法是:

'A'[0].ord

不幸的是,Ruby 1.8中不存在ord方法。

尝试:

'A'.unpack('c')

我想+1 dylanfm和AShelly的评论,但添加[0]:

'A'.unpack('C')[0]

unpack调用返回一个包含单个整数的数组,在需要整数的地方并不总是接受:

$ ruby -e 'printf("0x%02X\n", "A".unpack("C"))'
-e:1:in `printf': can't convert Array into Integer (TypeError)
    from -e:1
$ ruby -e 'printf("0x%02X\n", "A".unpack("C")[0])'
0x41
$ 

我正在尝试编写适用于Ruby 1.8.1,1.8.7和1.9.2的代码。

编辑传递C以大写形式解包,因为unpack(<!> quot; c <!> quot;)给我-1,其中ord()给我255(尽管在C的char签名的平台上运行)

刚刚通过RFC将纯粹的Ruby版本的Stringprep放在一起时遇到了这个问题。

请注意chr在[0,255]之外失败,而是使用1.9.x - 2.1.x便携式替换:

[22] pry(main)> "\u0221".ord.chr
RangeError: 545 out of char range
from (pry):2:in 'chr'
[23] pry(main)> x = "\u0221".unpack('U')[0]
=> 545
[24] pry(main)> [x].pack('U')
=> "ȡ"
[25] pry(main)>

此外,如果您在字符串中有char并且想要在没有循环的情况下解码它:

puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122

怎么样

  

放?A

如果您不介意从数组中提取值,可以使用"A".bytes

你可以拥有这些:

65.chr.ord
'a'.ord.chr

我正在为1.8.6和1.9.3编写代码,但我无法在以下两种环境中使用这些解决方案:(

然而,我遇到了另一个解决方案: http://smajnr.net /2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html

这对我来说也不起作用,但我根据我的需要进行了改编:

unless "".respond_to?(:ord)
  class Fixnum
    def ord
      return self
    end
  end
end

完成后,以下内容将适用于两种环境

'A'[0].ord

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top