4 ** See Copyright Notice in mruby.h
8 #include <mruby/array.h>
9 #include <mruby/hash.h>
13 * hsh.values_at(key, ...) -> array
15 * Return an array containing the values associated with the given keys.
16 * Also see <code>Hash.select</code>.
18 * h = { "cat" => "feline", "dog" => "canine", "cow" => "bovine" }
19 * h.values_at("cow", "cat") #=> ["bovine", "feline"]
23 hash_values_at(mrb_state
*mrb
, mrb_value hash
)
25 const mrb_value
*argv
;
30 mrb_get_args(mrb
, "*", &argv
, &argc
);
31 result
= mrb_ary_new_capa(mrb
, argc
);
32 if (argc
== 0) return result
;
33 ai
= mrb_gc_arena_save(mrb
);
34 for (i
= 0; i
< argc
; i
++) {
35 mrb_ary_push(mrb
, result
, mrb_hash_get(mrb
, hash
, argv
[i
]));
36 mrb_gc_arena_restore(mrb
, ai
);
43 * hsh.slice(*keys) -> a_hash
45 * Returns a hash containing only the given keys and their values.
47 * h = { a: 100, b: 200, c: 300 }
48 * h.slice(:a) #=> {:a=>100}
49 * h.slice(:b, :c, :d) #=> {:b=>200, :c=>300}
52 hash_slice(mrb_state
*mrb
, mrb_value hash
)
54 const mrb_value
*argv
;
58 mrb_get_args(mrb
, "*", &argv
, &argc
);
59 result
= mrb_hash_new_capa(mrb
, argc
);
60 if (argc
== 0) return result
; /* empty hash */
61 for (i
= 0; i
< argc
; i
++) {
62 mrb_value key
= argv
[i
];
65 val
= mrb_hash_fetch(mrb
, hash
, key
, mrb_undef_value());
66 if (!mrb_undef_p(val
)) {
67 mrb_hash_set(mrb
, result
, key
, val
);
75 * hsh.except(*keys) -> a_hash
77 * Returns a hash excluding the given keys and their values.
79 * h = { a: 100, b: 200, c: 300 }
80 * h.except(:a) #=> {:b=>200, :c=>300}
81 * h.except(:b, :c, :d) #=> {:a=>100}
84 hash_except(mrb_state
*mrb
, mrb_value hash
)
86 const mrb_value
*argv
;
90 mrb_get_args(mrb
, "*", &argv
, &argc
);
91 result
= mrb_hash_dup(mrb
, hash
);
92 for (i
= 0; i
< argc
; i
++) {
93 mrb_hash_delete_key(mrb
, result
, argv
[i
]);
99 mrb_mruby_hash_ext_gem_init(mrb_state
*mrb
)
104 mrb_define_method(mrb
, h
, "values_at", hash_values_at
, MRB_ARGS_ANY());
105 mrb_define_method(mrb
, h
, "slice", hash_slice
, MRB_ARGS_ANY());
106 mrb_define_method(mrb
, h
, "except", hash_except
, MRB_ARGS_ANY());