Struct magnus::typed_data::Obj

source ·
pub struct Obj<T> { /* private fields */ }
Expand description

A Ruby Object wrapping a Rust type T.

This is a Value pointer to a RTypedData struct, Ruby’s internal representation of objects that wrap foreign types. Unlike RTypedData it tracks the Rust type it should contains and errors early in TryConvert if types don’t match, rather than on Obj::get.

See the ReprValue and Object traits for additional methods available on this type. See Ruby for methods to create a typed_data::Obj.

Implementations§

source§

impl<T> Obj<T>
where T: TypedData,

source

pub fn wrap(data: T) -> Self

Wrap the Rust type T in a Ruby object.

§Panics

Panics if called from a non-Ruby thread. See Ruby::obj_wrap for the non-panicking version.

§Examples
use magnus::{class, define_class, prelude::*, typed_data};

#[magnus::wrap(class = "Point")]
struct Point {
    x: isize,
    y: isize,
}

let point_class = define_class("Point", class::object()).unwrap();

let value = typed_data::Obj::wrap(Point { x: 4, y: 2 });
assert!(value.is_kind_of(point_class));
source

pub fn wrap_as(data: T, class: RClass) -> Self

Wrap the Rust type T in a Ruby object that is an instance of the given class.

See also TypedData::class_for.

§Panics

Panics if class is not a subclass of <T as TypedData>::class(), or if called from a non-Ruby thread. See Ruby::obj_wrap_as for a version that can not be called from a non-Ruby thread, so will not panic for that reason.

§Examples
use magnus::{class, define_class, prelude::*, typed_data};

#[magnus::wrap(class = "Point")]
struct Point {
    x: isize,
    y: isize,
}

let point_class = define_class("Point", class::object()).unwrap();
let point_sub_class = define_class("SubPoint", point_class).unwrap();

let value = typed_data::Obj::wrap_as(Point { x: 4, y: 2 }, point_sub_class);
assert!(value.is_kind_of(point_sub_class));
assert!(value.is_kind_of(point_class));

Allowing a wrapped type to be subclassed from Ruby:

(note, in this example Point does not have and does not call the initialize method, subclasses would need to override the class new method rather than initialize)

use magnus::{
    class, define_class, eval, function, method, prelude::*, typed_data, RClass, Value,
};

#[magnus::wrap(class = "Point")]
struct Point {
    x: isize,
    y: isize,
}

impl Point {
    fn new(class: RClass, x: isize, y: isize) -> typed_data::Obj<Self> {
        typed_data::Obj::wrap_as(Self { x, y }, class)
    }
}
let point_class = define_class("Point", class::object()).unwrap();
point_class
    .define_singleton_method("new", method!(Point::new, 2))
    .unwrap();
point_class
    .define_singleton_method("inherited", function!(RClass::undef_default_alloc_func, 1))
    .unwrap();

let value: Value = eval(
    r#"
      class SubPoint < Point
      end
      SubPoint.new(4, 2)
    "#,
)
.unwrap();

assert!(value.is_kind_of(class::object().const_get::<_, RClass>("SubPoint").unwrap()));
assert!(value.is_kind_of(point_class));

Trait Implementations§

source§

impl<T> Clone for Obj<T>
where T: TypedData,

source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<T> Debug for Obj<T>
where T: TypedData,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<T> Deref for Obj<T>
where T: TypedData,

source§

fn deref(&self) -> &Self::Target

Dereference to the Rust type wrapped in the Ruby object self.

§Examples
use magnus::{class, define_class, typed_data};

#[magnus::wrap(class = "Point")]
#[derive(Debug, PartialEq, Eq)]
struct Point {
    x: isize,
    y: isize,
}

define_class("Point", class::object()).unwrap();
let value = typed_data::Obj::wrap(Point { x: 4, y: 2 });

assert_eq!(&*value, &Point { x: 4, y: 2 });
§

type Target = T

The resulting type after dereferencing.
source§

impl<T> Display for Obj<T>
where T: TypedData,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<T> From<Obj<T>> for RTypedData
where T: TypedData,

source§

fn from(val: Obj<T>) -> Self

Converts to this type from the input type.
source§

impl<T> IntoValue for Obj<T>
where T: TypedData,

source§

fn into_value_with(self, handle: &Ruby) -> Value

Convert self into Value.
source§

fn into_value(self) -> Value

Convert self into Value. Read more
source§

unsafe fn into_value_unchecked(self) -> Value

Convert self into Value. Read more
source§

impl<T> Object for Obj<T>
where T: TypedData,

source§

fn define_singleton_method<M>(self, name: &str, func: M) -> Result<(), Error>
where M: Method,

Define a singleton method in self’s scope. Read more
source§

fn ivar_get<T, U>(self, name: T) -> Result<U, Error>
where T: IntoId, U: TryConvert,

Get the value for the instance variable name within self’s scope. Read more
source§

fn ivar_set<T, U>(self, name: T, value: U) -> Result<(), Error>
where T: IntoId, U: IntoValue,

Set the value for the instance variable name within self’s scope. Read more
source§

fn singleton_class(self) -> Result<RClass, Error>

Finds or creates the singleton class of self. Read more
source§

fn extend_object(self, module: RModule) -> Result<(), Error>

Extend self with module. Read more
source§

impl<T> ReprValue for Obj<T>
where T: TypedData,

source§

fn as_value(self) -> Value

Return self as a Value.
source§

fn is_nil(self) -> bool

Returns whether self is Ruby’s nil value. Read more
source§

fn equal<T>(self, other: T) -> Result<bool, Error>
where T: ReprValue,

Checks for equality, delegating to the Ruby method #==. Read more
source§

fn eql<T>(self, other: T) -> Result<bool, Error>
where T: ReprValue,

Checks for equality, delegating to the Ruby method #eql?. Read more
source§

fn hash(self) -> Result<Integer, Error>

Returns an integer non-uniquely identifying self. Read more
source§

fn class(self) -> RClass

Returns the class that self is an instance of. Read more
source§

fn is_frozen(self) -> bool

Returns whether self is ‘frozen’. Read more
source§

fn check_frozen(self) -> Result<(), Error>

Returns an error if self is ‘frozen’. Read more
source§

fn freeze(self)

Mark self as frozen. Read more
source§

fn to_bool(self) -> bool

Convert self to a bool, following Ruby’s rules of false and nil as boolean false and everything else boolean true. Read more
source§

fn funcall<M, A, T>(self, method: M, args: A) -> Result<T, Error>
where M: IntoId, A: ArgList, T: TryConvert,

Call the method named method on self with args. Read more
source§

fn funcall_public<M, A, T>(self, method: M, args: A) -> Result<T, Error>
where M: IntoId, A: ArgList, T: TryConvert,

Call the public method named method on self with args. Read more
source§

fn check_funcall<M, A, T>(self, method: M, args: A) -> Option<Result<T, Error>>
where M: IntoId, A: ArgList, T: TryConvert,

If self responds to the method named method, call it with args. Read more
source§

fn funcall_with_block<M, A, T>( self, method: M, args: A, block: Proc ) -> Result<T, Error>
where M: IntoId, A: ArgList, T: TryConvert,

Call the method named method on self with args and block. Read more
source§

fn block_call<M, A, R, T>( self, method: M, args: A, block: fn(_: &[Value], _: Option<Proc>) -> R ) -> Result<T, Error>
where M: IntoId, A: ArgList, R: BlockReturn, T: TryConvert,

Call the method named method on self with args and block. Read more
source§

fn respond_to<M>(self, method: M, include_private: bool) -> Result<bool, Error>
where M: IntoId,

Check if self responds to the given Ruby method. Read more
source§

fn to_r_string(self) -> Result<RString, Error>

Convert self to a Ruby String. Read more
source§

unsafe fn to_s(&self) -> Result<Cow<'_, str>, Error>

Convert self to a Rust string. Read more
source§

fn inspect(self) -> String

Convert self to its Ruby debug representation. Read more
source§

unsafe fn classname(&self) -> Cow<'_, str>

Return the name of self’s class. Read more
source§

fn is_kind_of<T>(self, class: T) -> bool
where T: ReprValue + Module,

Returns whether or not self is an instance of class. Read more
source§

fn enumeratorize<M, A>(self, method: M, args: A) -> Enumerator
where M: IntoSymbol, A: ArgList,

Generate an Enumerator from method on self, passing args to method. Read more
source§

impl<T> TryConvert for Obj<T>
where T: TypedData,

source§

fn try_convert(val: Value) -> Result<Self, Error>

Convert val into Self.
source§

impl<T> Copy for Obj<T>
where T: TypedData,

Auto Trait Implementations§

§

impl<T> Freeze for Obj<T>

§

impl<T> RefUnwindSafe for Obj<T>
where T: RefUnwindSafe,

§

impl<T> Send for Obj<T>
where T: Send,

§

impl<T> Sync for Obj<T>
where T: Sync,

§

impl<T> Unpin for Obj<T>
where T: Unpin,

§

impl<T> UnwindSafe for Obj<T>
where T: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> AsRawValue for T
where T: ReprValue,

source§

fn as_raw(self) -> u64

Available on crate feature rb-sys only.
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Inspect for T
where T: Debug,

source§

fn inspect(&self) -> String

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> BlockReturn for T
where T: BlockReturn,

source§

impl<T> Locate for T
where T: ReprValue,

source§

impl<T> Mark for T
where T: ReprValue,

source§

impl<T> ReturnValue for T
where T: ReturnValue,