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。我猜键和值绑定到不同的变量。因此,数组的参数销毁不起作用。