Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中区分数组中十进制数和整数的索引?_Ruby_Arrays - Fatal编程技术网

在Ruby中区分数组中十进制数和整数的索引?

在Ruby中区分数组中十进制数和整数的索引?,ruby,arrays,Ruby,Arrays,由于Ruby进行类型转换,如何正确获取索引 我想把这个退1 [1,2.0,2,3].index(2.0) #=> 1 我想把这个退2 [1,2.0,2,3].index(2) #=> 1 将块与eql?一起使用是一种方法: [1,2.0,2,3].index {|e| e.eql? 2.0} #=> 1 [1,2.0,2,3].index {|e| e.eql? 2} #=> 2 与=不同,eql?仅当接收器和参数具有相同类型和相等值时才返回true。所以2==2.

由于Ruby进行类型转换,如何正确获取索引

我想把这个退1

[1,2.0,2,3].index(2.0)
#=> 1
我想把这个退2

[1,2.0,2,3].index(2)
#=> 1

将块与
eql?
一起使用是一种方法:

[1,2.0,2,3].index {|e| e.eql? 2.0}
#=> 1
[1,2.0,2,3].index {|e| e.eql? 2}
#=> 2
=
不同,
eql?
仅当接收器和参数具有相同类型和相等值时才返回
true
。所以
2==2.0
返回
true
2.eql?2.0
返回
false

数组#索引和相等 您没有得到预期的结果,因为使用了更通用的而不是比较值,这没有考虑参数/值的类型。在duck类型语言中,这通常是您想要的

考虑以下示例,该示例使用
==
将a与a进行比较:

注意,Ruby认为这两个数值是相等的,尽管它们的类型不同。这是。由于数组的非块形式#index将参数为
=
的第一个索引返回到索引值,
[1,2.0,2,3]。索引(2.0)
[1,2.0,2,3]。索引(2)
都将返回相同的索引

使用数组的块形式#索引 所有Ruby方法都接受一个可选块,当为true时,一些核心类的行为会有所不同。Array#index的文档说明:

如果给定一个块…返回块返回true的第一个对象的索引。如果未找到匹配项,则返回nil

区分两种不同类型值的标准方法是使用块形式的数组#索引来检查对象是否与#eql?而不是使用#=。例如:

array = [1,2.0,2,3]
array.index { |i| i.eql? 2   }
array.index { |i| i.eql? 2.0 }
这将返回您期望的值,但需要额外键入一点。这确实是解决您问题的首选方案

猴子补丁数组类 猴子修补核心类(如数组)通常是个坏主意™, 但您可以通过重新打开Array类并修改Array#index的行为来检查类型和值是否相等,从而强制Array#index按您想要的方式运行。实现这一点的一种方法是在的帮助下,并通过使用的块语法在使用数字参数调用Array#index时进行检查

考虑以下几点:

class Array
  alias_method :old_index, :index
  def index value
    old_index { |i| i.eql? value }
  end
end

[1,2.0,2,3].index 2.0
#=> 1
[1,2.0,2,3].index 2
#=> 2
这是您所期望的工作方式,您仍然可以随时使用Array#old_索引进行原始类型不可知的相等性检查。但是,请小心使用,因为一旦更改了Array类的正常行为,其他模块或gem可能不会按预期运行

很高兴知道你能做到这一点,但玩电锯本身就是一项危险的活动。您的里程可能会有所不同

class Array
  alias_method :old_index, :index
  def index value
    old_index { |i| i.eql? value }
  end
end

[1,2.0,2,3].index 2.0
#=> 1
[1,2.0,2,3].index 2
#=> 2