Ruby循环顺序?

我正在尝试强制密码。 当我玩一些循环时,我注意到有一个特定的顺序。 比如说,如果我for i in '.'..'~'for i in '.'..'~'话。’〜 for i in '.'..'~'for i in '.'..'~'这样

 . / 0 1 2 3 4 5 6 7 8 9 : ;  ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ 

看到这个之后,我自己想知道“Ruby中的循环顺序是什么?” 什么字符是最高优先级,哪个是最低优先级? 对不起,这个问题是基本的。 我还没有找到任何人都知道的网站。 如果您对这个问题有疑问,请询问。 我希望这很清楚!

订单由字母的二进制表示定义。 反过来,它由标准定义。 使用的标准是ASCII(美国信息交换标准码)。

http://www.asciitable.com/

存在其他编码标准,例如IBM中端计算机使用的EBCDIC。

for / in是(大部分) each语法糖 ,所以

 for i in '.'..'~' do puts i end 

是(大致)等价(模数局部变量范围)

 ('.'..'~').each do |i| puts i end 

这意味着我们必须查看Range#each答案( 大胆强调我的):

each {| i | block } each {| i | block }rng

迭代范围的元素,将每个元素依次传递给块。

只有在范围的begin对象支持succ方法时,才能使用每个方法 。 如果对象没有定义succ方法(如Float),则引发TypeError

Range类本身的文档提供了更多详细信息:

范围中的自定义对象

可以使用可以使用<=>运算符进行比较的任何对象构建范围。 将范围视为序列( #each和从Enumerableinheritance的方法)的方法期望begin对象实现succ方法以按顺序返回下一个对象

因此,虽然没有直接拼写,但很明显Range#each有效的

  1. 重复发送succ消息到begin对象(然后发送到succ返回的对象,然后发送到对象,依此类推),以及
  2. 使用<=>太空船组合比较运算符将当前元素与结束对象进行比较,以确定是生成另一个对象还是结束循环。

这意味着我们必须查看String#succ next:

succnew_str

返回str的后继。 后继是通过从字符串中最右边的字母数字(或最右边的字符,如果没有字母数字)开始递增字符来计算的。 增加一个数字总是会产生另一个数字,并且递增一个字母会产生同一个案例的另一个字母。 增加非字母数字使用基础字符集的整理顺序

基本上,这意味着:

  • 递增一封信就能满足您的期望
  • 递增数字符合您的预期
  • 递增既不是字母也不是数字的东西是任意的,并且取决于字符串的字符集的整理顺序

在这种特殊情况下,您没有告诉我们您的字符串的整理顺序是什么,但我认为它是ASCII ,这意味着您可以得到通俗地称为ASCIIbetical排序的内容 。

这不是优先权,而是价值的顺序。 如前所述,字符具有自己的ASCII表示 (例如,’a’值为97,’z’值为122)。

您可以尝试这样做:

 ('a'..'z').each do |c| puts c.ord end 

类似地,这应该也有效:

 (97..122).each do |i| puts i.chr end