Ruby中的双点表示法

时间:2014-07-08 02:23:24

标签: ruby range

我正在研究RubyMonk中一个名为“Kaprekar's Number”的问题。例如,9^2为81,结果又为9:8 + 1 = 9

在问题的一部分中,他们使用了我不太懂的双点表示法:

def kaprekar?(k)
  number_of_digits = k.to_s.size
  square_root = (k**2).to_s

  second_half = square_root[-number_of_digits..-1]
  first_half = square_root.size.even? ? square_root[0..number_of_digits-1] : square_root[0..number_of_digits-2]

  k == first_half.to_i + second_half.to_i
end

例如,在second_halffirst_half中,我知道first_half是一个三元操作“if?then:else”,但是[-number_of_digits..-1]或{{ 1}}意味着什么?

这是表达范围之类的东西吗?

1 个答案:

答案 0 :(得分:4)

双点表示法表示范围。 因此,举例来说,1..10就像是说"从1到10"。

当与数组一起使用时,它通常表示一系列数组索引。 因此,如果你有my_array[1..10],它将是my_array的元素,索引从1到10。"

在数组索引范围内使用负数时,它表示从数组右端开始计数的数字。因此" -1"是来自右端的第一个数组索引。

因此,对于您的具体示例:square_root是一个字符串(有点像字符数组)...所以square_root[0..number_of_digits-1]表示" {{1}中的字符}字符串从0(开头)到square_root",(number of digits - 1)表示" square_root[number_of_digits..-1]字符串中的字符,从square_root开始,上升到字符串的末尾。"

number_of_digitssquare_root[0..number_of_digits-1]表示将字符串拆分为square_root[number_of_digits..-1]所代表的一半。