Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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 Arrayreject和Arraymap迭代器的行为_Ruby - Fatal编程技术网

Ruby Arrayreject和Arraymap迭代器的行为

Ruby Arrayreject和Arraymap迭代器的行为,ruby,Ruby,我有一堆日期: values = {a: Time.now, b: Time.now - 3.days} # => {:a=>2015-11-24 22:35:56 +0900, :b=>2015-11-21 22:35:56 +0900} 要选择日期在一天之内的值,我写道: values.reject{|i, v| v < Time.now - 1.day} # => {:a=>2015-11-24 22:35:56 +0900} 使用map时,它可以工

我有一堆日期:

values = {a: Time.now, b: Time.now - 3.days}
# => {:a=>2015-11-24 22:35:56 +0900, :b=>2015-11-21 22:35:56 +0900}
要选择日期在一天之内的值,我写道:

values.reject{|i, v| v < Time.now - 1.day}
# => {:a=>2015-11-24 22:35:56 +0900}
使用map时,它可以工作

values.map{|i| i[1]}
# => [2015-11-24 22:35:56 +0900, 2015-11-21 22:35:56 +0900]
为什么Arrayreject的行为会有所不同

Hashreject向块生成键和值。我只是钥匙。你的钥匙是符号;假设符号上的数组访问器i[1]返回nil

我想Hashmap不是什么东西。您可能正在获取Enumerablemap。哈希是可枚举的,所以您仍然可以在哈希上调用map

Enumerablemap正在从散列中以2元素数组的形式生成每个键值对:[:a,2015-11-24 22:35:56+0900]

顺便说一句,在许多语言中,哈希被称为关联数组。Rubyists通常称之为Hash。

reject是一种基于Hash的方法,它接受一个包含两个块变量的块:key和value。如果只传递一个只有一个变量的块,如下所示:

some_hash.reject{|x| ...}
some_hash.map{|x| ...}
然后x将被分配键,其对应的值不可访问。执行x[1]调用x上的symbol方法[],该方法给出nil,因为:a和:b只有一个字符长

另一方面,Enumerablemap隐式地将哈希转换为数组,并使用一个块变量获取一个块。如果您实际传递一个带有一个变量的块,如下所示:

some_hash.reject{|x| ...}
some_hash.map{|x| ...}
那么x将是一个具有键值对的数组。执行x[1]调用数组方法[],并返回哈希值

如果您改为传递带有两个变量的块,如下所示:

some_hash.map{|x, y| ...}
然后,销毁将隐式应用于调整变量的数量,即live about将被解释为:

some_hash.map{|(x, y)| ...}
x,y将限制性地成为键和值


您可能感到困惑,因为Arrayreject只接受一个变量的块,与Hashreject的工作方式不同。

代码中没有数组。您使用的是Hash.reject。我猜键和值绑定到不同的变量。因此,数组的参数销毁不起作用。