Ruby 我可以用什么来代替char.to_I?

Ruby 我可以用什么来代替char.to_I?,ruby,Ruby,对于赋值,我需要编写一个名为get_integer_from_string的方法,该方法将输入字符串转换为整数。 我已经完成了,但有一个要求: 请不要使用隐式或自动类型转换来解决此问题 问题,即C语言中的atoi、Python中的intin、parseInt等函数 在Java中或在PHP中使用intval 我可以在下面的代码中用什么替换char.to_I以满足此要求 def get_integer_from_string(str, based=7) return 0 if (/^(?<

对于赋值,我需要编写一个名为get_integer_from_string的方法,该方法将输入字符串转换为整数。 我已经完成了,但有一个要求:

请不要使用隐式或自动类型转换来解决此问题 问题,即C语言中的atoi、Python中的intin、parseInt等函数 在Java中或在PHP中使用intval 我可以在下面的代码中用什么替换char.to_I以满足此要求

def get_integer_from_string(str, based=7)
  return 0 if (/^(?<num>\d+)$/ =~ str).nil?
  result = 0
  str.reverse.each_char.with_index do |char, index|
    tmp = char.to_i * based**index
    result += tmp
  end
  result rescue 0
end

我怀疑你想得太多了。由于char只能是十个不同字符串中的一个,因此只需将查找表作为哈希:

C_TO_I = {
  "0" => 0, "1" => 1, "2" => 2, "3" => 3, 
  "4" => 4, "5" => 5, "6" => 6, "7" => 7,
  "8" => 8, "9" => 9
}
然后用C_to_i[char]替换代码中的char.to_i。证明:

char = "7"
p C_TO_I[char]
# => 7

我怀疑你想得太多了。由于char只能是十个不同字符串中的一个,因此只需将查找表作为哈希:

C_TO_I = {
  "0" => 0, "1" => 1, "2" => 2, "3" => 3, 
  "4" => 4, "5" => 5, "6" => 6, "7" => 7,
  "8" => 8, "9" => 9
}
然后用C_to_i[char]替换代码中的char.to_i。证明:

char = "7"
p C_TO_I[char]
# => 7
在这里,我们使用表示数字的字符随后被定位的事实来重新实现to_i函数。raise子句处理无效输入,例如。G当基数为7时为8


在这里,我们使用表示数字的字符随后被定位的事实来重新实现to_i函数。raise子句处理无效输入,例如。G8当基数为7时。

仅用于踢腿,以下是编写方法的另一种方法:

C_TO_I = (?0..?9).each_with_index.to_h

def s_to_i(str, base=7, mag=0)
  return 0 if str.empty?
  C_TO_I[str[-1]] * base ** mag +
    s_to_i(str[0...-1], base, mag + 1)
end

str = "654"
p s_to_i(str) # => 333
当然,上面的C_TO_I散列只适用于基数为10或更低的情况。你可以用这样的东西一直升到36垒:

C_TO_I = [ *?0..?9, *?a..?z ].each_with_index.to_h

为了好玩,这里有另一种编写方法的方法:

C_TO_I = (?0..?9).each_with_index.to_h

def s_to_i(str, base=7, mag=0)
  return 0 if str.empty?
  C_TO_I[str[-1]] * base ** mag +
    s_to_i(str[0...-1], base, mag + 1)
end

str = "654"
p s_to_i(str) # => 333
当然,上面的C_TO_I散列只适用于基数为10或更低的情况。你可以用这样的东西一直升到36垒:

C_TO_I = [ *?0..?9, *?a..?z ].each_with_index.to_h

“0”…“9”。将带有{u索引{v,i{v,i]}.的映射到_h@mudasobwa因此,它将类似于“code”def get_integer_from_stringstr,base=7如果/^?\d+$/=~str.nil,则返回0?结果=0 str.reverse.each_char.with_index do | char,index | tmp=to-h*基于**索引结果+=tmp最终结果0end@AdelAlmaleh这个问题最好向这个答案的作者提出;如果我看到了我的答案,我会重新实现,这对于不寻常的基类更安全。@mudasobwa代码中的块是不必要的。“有了_index.to_h就可以了。”Jordan这个答案在将777转换为7-base时仍然存在问题。我明白了,这有点超出了原始问题的范围,但无论如何。是的,事实上,到h就足够了。'0'..'9'。用{v,i{v,i]}索引映射到_h@mudasobwa因此,它将类似于“code”def get_integer_from_stringstr,base=7如果/^?\d+$/=~str.nil,则返回0?结果=0 str.reverse.each_char.with_index do | char,index | tmp=to-h*基于**索引结果+=tmp最终结果0end@AdelAlmaleh这个问题最好向这个答案的作者提出;如果我看到了我的答案,我会重新实现,这对于不寻常的基类更安全。@mudasobwa代码中的块是不必要的。“有了_index.to_h就可以了。”Jordan这个答案在将777转换为7-base时仍然存在问题。我明白了,这有点超出了原始问题的范围,但无论如何。是的,事实上,to_h就足够了。基数可能大于10,例如,16?基数可能大于10,例如,16?[0..9,?a..z]。平面图和:to_a⇒ [*?0..9,*?a..z].[0..9,*?a..z]。平面地图和:到⇒ [*?0..?9,*?a..?z]。