pub struct RHash(/* private fields */);
Expand description
Implementations§
source§impl RHash
impl RHash
sourcepub fn from_value(val: Value) -> Option<Self>
pub fn from_value(val: Value) -> Option<Self>
Return Some(RHash)
if val
is a RHash
, None
otherwise.
§Examples
use magnus::{eval, RHash};
assert!(RHash::from_value(eval(r#"{"answer" => 42}"#).unwrap()).is_some());
assert!(RHash::from_value(eval("[]").unwrap()).is_none());
assert!(RHash::from_value(eval("nil").unwrap()).is_none());
sourcepub fn new() -> RHash
pub fn new() -> RHash
Create a new empty RHash
.
§Panics
Panics if called from a non-Ruby thread. See Ruby::hash_new
for the
non-panicking version.
§Examples
use magnus::RHash;
let hash = RHash::new();
assert!(hash.is_empty());
sourcepub fn with_capacity(n: usize) -> Self
Available on ruby_gte_3_2
only.
pub fn with_capacity(n: usize) -> Self
ruby_gte_3_2
only.Create a new empty RHash
with capacity for n
elements
pre-allocated.
§Panics
Panics if called from a non-Ruby thread. See Ruby::hash_new_capa
for the non-panicking version.
§Examples
use magnus::RHash;
let ary = RHash::with_capacity(16);
assert!(ary.is_empty());
sourcepub fn aset<K, V>(self, key: K, val: V) -> Result<(), Error>
pub fn aset<K, V>(self, key: K, val: V) -> Result<(), Error>
Set the value val
for the key key
.
Errors if self
is frozen or key
does not respond to hash
.
§Examples
use magnus::{rb_assert, RHash};
let hash = RHash::new();
hash.aset("answer", 42).unwrap();
rb_assert!(r#"hash == {"answer" => 42}"#, hash);
sourcepub fn bulk_insert<T>(self, slice: &[T]) -> Result<(), Error>where
T: ReprValue,
Available on ruby_gte_2_7
only.
pub fn bulk_insert<T>(self, slice: &[T]) -> Result<(), Error>where
T: ReprValue,
ruby_gte_2_7
only.Insert a list of key-value pairs into a hash at once.
§Examples
use magnus::{prelude::*, rb_assert, RHash, RString, Symbol};
let hash = RHash::new();
hash.bulk_insert(&[
Symbol::new("given_name").as_value(),
RString::new("Arthur").as_value(),
Symbol::new("family_name").as_value(),
RString::new("Dent").as_value(),
])
.unwrap();
rb_assert!(
r#"hash == {given_name: "Arthur", family_name: "Dent"}"#,
hash,
);
sourcepub fn update(self, other: RHash) -> Result<(), Error>
pub fn update(self, other: RHash) -> Result<(), Error>
Merges two hashes into one.
§Examples
use magnus::{eval, rb_assert, RHash};
let a: RHash = eval("{a: 1, b: 2}").unwrap();
let b: RHash = eval("{b: 3, c: 4}").unwrap();
a.update(b).unwrap();
// a is mutated, in case of conflicts b wins
rb_assert!("a == {a: 1, b: 3, c: 4}", a);
// b is unmodified
rb_assert!("b == {b: 3, c: 4}", b);
sourcepub fn aref<T, U>(self, key: T) -> Result<U, Error>where
T: IntoValue,
U: TryConvert,
pub fn aref<T, U>(self, key: T) -> Result<U, Error>where
T: IntoValue,
U: TryConvert,
Return the value for key
, converting it to U
.
Returns hash’s default if key
is missing. See also
lookup
, get
, and
fetch
.
§Examples
use magnus::{value::Qnil, RHash};
let hash = RHash::new();
hash.aset("answer", 42).unwrap();
assert_eq!(hash.aref::<_, i64>("answer").unwrap(), 42);
assert!(hash.aref::<_, Qnil>("missing").is_ok());
assert_eq!(hash.aref::<_, Option<i64>>("answer").unwrap(), Some(42));
assert_eq!(hash.aref::<_, Option<i64>>("missing").unwrap(), None);
use magnus::{eval, RHash};
let hash: RHash = eval(
r#"
hash = {"answer" => 42}
hash.default = 0
hash
"#,
)
.unwrap();
assert_eq!(hash.aref::<_, i64>("answer").unwrap(), 42);
assert_eq!(hash.aref::<_, i64>("missing").unwrap(), 0);
assert_eq!(hash.aref::<_, i64>(()).unwrap(), 0);
sourcepub fn lookup<T, U>(self, key: T) -> Result<U, Error>where
T: IntoValue,
U: TryConvert,
pub fn lookup<T, U>(self, key: T) -> Result<U, Error>where
T: IntoValue,
U: TryConvert,
Return the value for key
, converting it to U
.
Returns nil
if key
is missing. See also aref
,
get
, and fetch
.
§Examples
use magnus::{eval, value::Qnil, RHash};
let hash: RHash = eval(
r#"
hash = {"answer" => 42}
hash.default = 0
hash
"#,
)
.unwrap();
assert_eq!(hash.lookup::<_, i64>("answer").unwrap(), 42);
assert!(hash.lookup::<_, Qnil>("missing").is_ok());
assert_eq!(hash.lookup::<_, Option<i64>>("answer").unwrap(), Some(42));
assert_eq!(hash.lookup::<_, Option<i64>>("missing").unwrap(), None);
sourcepub fn get<T>(self, key: T) -> Option<Value>where
T: IntoValue,
pub fn get<T>(self, key: T) -> Option<Value>where
T: IntoValue,
Return the value for key
as a Value
.
Returns None
if key
is missing. See also aref
,
lookup
, and fetch
.
Note: It is possible for very badly behaved key objects to raise an
error during hash lookup. This is unlikely, and for the simplicity of
this api any errors will result in None
.
§Examples
use magnus::RHash;
let hash = RHash::new();
hash.aset("answer", 42).unwrap();
assert!(hash.get("answer").is_some());
assert!(hash.get("missing").is_none());
sourcepub fn fetch<T, U>(self, key: T) -> Result<U, Error>where
T: IntoValue,
U: TryConvert,
pub fn fetch<T, U>(self, key: T) -> Result<U, Error>where
T: IntoValue,
U: TryConvert,
Return the value for key
, converting it to U
.
Returns Err
if key
is missing. See also aref
,
lookup
, and get
.
§Examples
use magnus::{eval, RHash};
let hash: RHash = eval(
r#"
hash = {"answer" => 42}
hash.default = 0
hash
"#,
)
.unwrap();
assert_eq!(hash.fetch::<_, i64>("answer").unwrap(), 42);
assert!(hash.fetch::<_, i64>("missing").is_err());
assert_eq!(hash.fetch::<_, Option<i64>>("answer").unwrap(), Some(42));
assert!(hash.fetch::<_, Option<i64>>("missing").is_err());
sourcepub fn delete<T, U>(self, key: T) -> Result<U, Error>where
T: IntoValue,
U: TryConvert,
pub fn delete<T, U>(self, key: T) -> Result<U, Error>where
T: IntoValue,
U: TryConvert,
Removes the key key
from self and returns the associated value,
converting it to U
.
Returns nil
if key
is missing.
§Examples
use magnus::{eval, value::Qnil, RHash};
let hash: RHash = eval(r#"hash = {"answer" => 42}"#).unwrap();
assert_eq!(hash.delete::<_, i64>("answer").unwrap(), 42);
assert!(hash.delete::<_, Qnil>("answer").is_ok());
sourcepub fn clear(self) -> Result<(), Error>
pub fn clear(self) -> Result<(), Error>
Removes all entries from self
.
Errors if self
is frozen.
§Examples
use magnus::{eval, RHash};
let hash: RHash = eval(r#"{"answer" => 42}"#).unwrap();
assert!(!hash.is_empty());
hash.clear().unwrap();
assert!(hash.is_empty());
sourcepub fn foreach<F, K, V>(self, func: F) -> Result<(), Error>
pub fn foreach<F, K, V>(self, func: F) -> Result<(), Error>
Run func
for each key/value pair in self
.
The result of func
is checked on each call, when it is
ForEach::Continue
the iteration will continue, ForEach::Stop
will cause the iteration to stop, and ForEach::Delete
will remove
the key/value pair from self
and then continue iteration.
Returing an error from func
behaves like ForEach::Stop
.
§Examples
use magnus::{eval, r_hash::ForEach, RHash};
let hash: RHash = eval(r#"{"foo" => 1, "bar" => 2, "baz" => 4, "qux" => 8}"#).unwrap();
let mut found = None;
hash.foreach(|key: String, value: i64| {
if value > 3 {
found = Some(key);
Ok(ForEach::Stop)
} else {
Ok(ForEach::Continue)
}
})
.unwrap();
assert_eq!(found, Some(String::from("baz")));
sourcepub fn to_hash_map<K, V>(self) -> Result<HashMap<K, V>, Error>
pub fn to_hash_map<K, V>(self) -> Result<HashMap<K, V>, Error>
Return self
converted to a Rust HashMap
.
This will only convert to a map of ‘owned’ Rust native types. The types
representing Ruby objects can not be stored in a heap-allocated
datastructure like a HashMap
as they are hidden from the mark phase
of Ruby’s garbage collector, and thus may be prematurely garbage
collected in the following sweep phase.
Errors if the conversion of any key or value fails.
§Examples
use std::collections::HashMap;
use magnus::{eval, RHash};
let r_hash: RHash = eval(r#"{"answer" => 42}"#).unwrap();
let mut hash_map = HashMap::new();
hash_map.insert(String::from("answer"), 42);
assert_eq!(r_hash.to_hash_map().unwrap(), hash_map);
sourcepub fn to_vec<K, V>(self) -> Result<Vec<(K, V)>, Error>where
K: TryConvertOwned,
V: TryConvertOwned,
pub fn to_vec<K, V>(self) -> Result<Vec<(K, V)>, Error>where
K: TryConvertOwned,
V: TryConvertOwned,
Convert self
to a Rust vector of key/value pairs.
This will only convert to a map of ‘owned’ Rust native types. The types
representing Ruby objects can not be stored in a heap-allocated
datastructure like a Vec
as they are hidden from the mark phase
of Ruby’s garbage collector, and thus may be prematurely garbage
collected in the following sweep phase.
Errors if the conversion of any key or value fails.
§Examples
use magnus::{eval, RHash};
let r_hash: RHash = eval(r#"{"answer" => 42}"#).unwrap();
assert_eq!(r_hash.to_vec().unwrap(), vec![(String::from("answer"), 42)]);
Trait Implementations§
source§impl<K, V> FromIterator<(K, V)> for RHash
impl<K, V> FromIterator<(K, V)> for RHash
source§impl Object for RHash
impl Object for RHash
source§fn define_singleton_method<M>(self, name: &str, func: M) -> Result<(), Error>where
M: Method,
fn define_singleton_method<M>(self, name: &str, func: M) -> Result<(), Error>where
M: Method,
self
’s scope. Read moresource§impl ReprValue for RHash
impl ReprValue for RHash
source§fn equal<T>(self, other: T) -> Result<bool, Error>where
T: ReprValue,
fn equal<T>(self, other: T) -> Result<bool, Error>where
T: ReprValue,
#==
. Read moresource§fn eql<T>(self, other: T) -> Result<bool, Error>where
T: ReprValue,
fn eql<T>(self, other: T) -> Result<bool, Error>where
T: ReprValue,
#eql?
. Read moresource§fn hash(self) -> Result<Integer, Error>
fn hash(self) -> Result<Integer, Error>
self
. Read moresource§fn to_bool(self) -> bool
fn to_bool(self) -> bool
self
to a bool
, following Ruby’s rules of false
and nil
as boolean false
and everything else boolean true
. Read moresource§fn funcall_public<M, A, T>(self, method: M, args: A) -> Result<T, Error>
fn funcall_public<M, A, T>(self, method: M, args: A) -> Result<T, Error>
source§fn block_call<M, A, R, T>(
self,
method: M,
args: A,
block: fn(_: &[Value], _: Option<Proc>) -> R
) -> Result<T, Error>
fn block_call<M, A, R, T>( self, method: M, args: A, block: fn(_: &[Value], _: Option<Proc>) -> R ) -> Result<T, Error>
source§fn respond_to<M>(self, method: M, include_private: bool) -> Result<bool, Error>where
M: IntoId,
fn respond_to<M>(self, method: M, include_private: bool) -> Result<bool, Error>where
M: IntoId,
self
responds to the given Ruby method. Read more