草庐IT

HASH_ALGORITHM

全部标签

ruby - 向 Hash.new([]) 注入(inject)元素时 << 和 += 有什么区别?

这个问题在这里已经有了答案:Strange,unexpectedbehavior(disappearing/changingvalues)whenusingHashdefaultvalue,e.g.Hash.new([])(4个答案)关闭2年前。这段代码:[{:id=>1,:key=>3},{:id=>2,:key=>4},{:id=>3,:key=>5}].inject(Hash.new([])){|h,i|h[i[:key]]返回:{}同时:[{:id=>1,:key=>3},{:id=>2,:key=>4},{:id=>3,:key=>5}].inject(Hash.new([]

Ruby 自动将 Hash 扩展为关键字参数而无需双拼

下面的Ruby代码导致:unknownkeyword:a(ArgumentError):deftest(x={},y:true);endtest({a:1})为什么?我希望test(**{a:1})会发生这种情况,但我不明白为什么我的哈希会在没有双拼音的情况下自动扩展。 最佳答案 由于x是可选的,因此hash移至kwarg参数。在这种情况下,未指定的关键字会引发错误:deffoo(name:)pnameendfoo#raises"ArgumentError:missingkeyword:name"asexpectedfoo({nam

ruby-on-rails - Hash#slice 类方法,如果给定键不存在则返回 nil

我在我的Rails环境中使用Hash#slice方法。slice方法的工作原理如下:{a:1,b:2,d:4}.slice(:a,:c,:d)=>{:a=>1,:d=>4}但是如果给定的键不存在,我想返回一个nil,像这样:{a:1,b:2,d:4}.slice(:a,:c,:d)=>{:a=>1,:c=>nil,:d=>4}这是我为函数写的,有没有更好的方法来写这个函数?hash={a:1,b:2,d:4}keys=[:a,:c,:d]keys_not_present=keys.map{|key|keyunlesshash.has_key?(key)}.compactkeys_not

ruby - RuboCop 在使用 'Hash.new' 时提示

当我使用Hash.new时,RuboCop会提示,并建议我改用散列文字。有没有办法让RuboCop忽略Hash.new的使用?更具体地说,我可以编辑我的.rubocop.yml配置以允许使用Hash.new而不会引起任何投诉吗? 最佳答案 您可以禁用Rubocop::Cop::Style::EmptyLiteralcop在rubocop.yml文件中:#.rubocop.ymlStyle:EmptyLiteral:false或者如果你只想忽略某一行:hsh=Hash.new#rubocop:disableStyle/EmptyLit

arrays - 为什么 Hash#merge 使用 splat 运算符返回哈希数组数组而不是哈希数组?

长话短说我通过反复试验解决了这个问题,但我对splat运算符和pp方法如何始终给我一个与我认为的不同的对象的理解显然存在差距。我想了解这个差距,并确定一种更好的方法来合并哈希数组。我也希望将来能够更有效地调试这类事情。首先是代码示例和调试步骤。我半满意的解决方案和更详细的问题在底部。代码我正在使用MRIRuby2.6.2。给定Foo类,我希望Foo#windows返回合并的散列。这是该类的一个最小示例:classFooattr_reader:windowsdefinitialize@windows={}enddefpry{pry:"stuffpry\r"}enddefirb{irb:"

ruby - 符号如何(例如 :label) handled as part of a parameter hash

我正在查看O'Reilly书中关于RubyonRails的示例代码并遇到了这个:deflabel_for(method,options={})extra=""ifoptions[:required]extra="*"endlabel(:label||method)+extra+""end我知道options是一个散列,但它怎么能只用:label调用label-不应该吗需要说options[:label]吗?谢谢! 最佳答案 是的,我相信是这样,否则:label符号将始终作为method名称传递给label助手。

c++ - 标准容器没有 std::hash 的特化吗?

我just发现自己无法简单地使用a有点惊讶std::unordered_set>test;因为对于std::array似乎没有std::hash特化。这是为什么?还是我根本没找到?如果确实没有,是否可以简化以下实现尝试?namespacestd{templatestructhash>{typedefarrayargument_type;typedefsize_tresult_type;result_typeoperator()(constargument_type&a)const{hashhasher;result_typeh=0;for(result_typei=0;i我真的觉得这应

c++ - 标准容器没有 std::hash 的特化吗?

我just发现自己无法简单地使用a有点惊讶std::unordered_set>test;因为对于std::array似乎没有std::hash特化。这是为什么?还是我根本没找到?如果确实没有,是否可以简化以下实现尝试?namespacestd{templatestructhash>{typedefarrayargument_type;typedefsize_tresult_type;result_typeoperator()(constargument_type&a)const{hashhasher;result_typeh=0;for(result_typei=0;i我真的觉得这应

ruby-on-rails - 数组参数上的 rspec 匹配器类似于 hash_including

在rspec中,您可以测试对方法的调用是否接收到一个参数,该参数是一个散列并且包含某些键或键值对。即:my_object.should_receive(:my_method).with(hash_including(:a=>'alpha'))有没有什么可以用数组完成类似的匹配?看起来像什么?my_object.should_receive(:my_method).with(array_including('alpha')) 最佳答案 这个怎么样:my_obj.should_receive(:my_method)do|arg|arg.

ruby - 为什么 Ruby #hash 方法是随机的?

我刚刚注意到每次启动Ruby时#hash的返回值都会改变:$irb2.0.0-p353:001>"".hash23134253497836131152.0.0-p353:002>exit$irb2.0.0-p353:001>"".hash45435648979748136882.0.0-p353:002>exit我查看了MRI源以了解发生这种情况的原因:st_index_trb_str_hash(VALUEstr){inte=ENCODING_GET(str);if(e&&rb_enc_str_coderange(str)==ENC_CODERANGE_7BIT){e=0;}retur