Trait sp_std::any::Any

1.0.0 · source ·
pub trait Any: 'static {
    fn type_id(&self) -> TypeId;
}
Expand description

A trait to emulate dynamic typing.

Most types implement Any. However, any type which contains a non-'static reference does not. See the module-level documentation for more details.

Required Methods§

Gets the TypeId of self.

Examples
use std::any::{Any, TypeId};

fn is_string(s: &dyn Any) -> bool {
    TypeId::of::<String>() == s.type_id()
}

assert_eq!(is_string(&0), false);
assert_eq!(is_string(&"cookie monster".to_string()), true);

Implementations§

Attempt to downcast the box to a concrete type.

Examples
use std::any::Any;

fn print_if_string(value: Box<dyn Any>) {
    if let Ok(string) = value.downcast::<String>() {
        println!("String ({}): {}", string.len(), string);
    }
}

let my_string = "Hello World".to_string();
print_if_string(Box::new(my_string));
print_if_string(Box::new(0i8));
🔬This is a nightly-only experimental API. (downcast_unchecked)

Downcasts the box to a concrete type.

For a safe alternative see downcast.

Examples
#![feature(downcast_unchecked)]

use std::any::Any;

let x: Box<dyn Any> = Box::new(1_usize);

unsafe {
    assert_eq!(*x.downcast_unchecked::<usize>(), 1);
}
Safety

The contained value must be of type T. Calling this method with the incorrect type is undefined behavior.

Attempt to downcast the box to a concrete type.

Examples
use std::any::Any;

fn print_if_string(value: Box<dyn Any + Send>) {
    if let Ok(string) = value.downcast::<String>() {
        println!("String ({}): {}", string.len(), string);
    }
}

let my_string = "Hello World".to_string();
print_if_string(Box::new(my_string));
print_if_string(Box::new(0i8));
🔬This is a nightly-only experimental API. (downcast_unchecked)

Downcasts the box to a concrete type.

For a safe alternative see downcast.

Examples
#![feature(downcast_unchecked)]

use std::any::Any;

let x: Box<dyn Any + Send> = Box::new(1_usize);

unsafe {
    assert_eq!(*x.downcast_unchecked::<usize>(), 1);
}
Safety

The contained value must be of type T. Calling this method with the incorrect type is undefined behavior.

Attempt to downcast the box to a concrete type.

Examples
use std::any::Any;

fn print_if_string(value: Box<dyn Any + Send + Sync>) {
    if let Ok(string) = value.downcast::<String>() {
        println!("String ({}): {}", string.len(), string);
    }
}

let my_string = "Hello World".to_string();
print_if_string(Box::new(my_string));
print_if_string(Box::new(0i8));
🔬This is a nightly-only experimental API. (downcast_unchecked)

Downcasts the box to a concrete type.

For a safe alternative see downcast.

Examples
#![feature(downcast_unchecked)]

use std::any::Any;

let x: Box<dyn Any + Send + Sync> = Box::new(1_usize);

unsafe {
    assert_eq!(*x.downcast_unchecked::<usize>(), 1);
}
Safety

The contained value must be of type T. Calling this method with the incorrect type is undefined behavior.

Returns true if the inner type is the same as T.

Examples
use std::any::Any;

fn is_string(s: &dyn Any) {
    if s.is::<String>() {
        println!("It's a string!");
    } else {
        println!("Not a string...");
    }
}

is_string(&0);
is_string(&"cookie monster".to_string());

Returns some reference to the inner value if it is of type T, or None if it isn’t.

Examples
use std::any::Any;

fn print_if_string(s: &dyn Any) {
    if let Some(string) = s.downcast_ref::<String>() {
        println!("It's a string({}): '{}'", string.len(), string);
    } else {
        println!("Not a string...");
    }
}

print_if_string(&0);
print_if_string(&"cookie monster".to_string());

Returns some mutable reference to the inner value if it is of type T, or None if it isn’t.

Examples
use std::any::Any;

fn modify_if_u32(s: &mut dyn Any) {
    if let Some(num) = s.downcast_mut::<u32>() {
        *num = 42;
    }
}

let mut x = 10u32;
let mut s = "starlord".to_string();

modify_if_u32(&mut x);
modify_if_u32(&mut s);

assert_eq!(x, 42);
assert_eq!(&s, "starlord");
🔬This is a nightly-only experimental API. (downcast_unchecked)

Returns a reference to the inner value as type dyn T.

Examples
#![feature(downcast_unchecked)]

use std::any::Any;

let x: Box<dyn Any> = Box::new(1_usize);

unsafe {
    assert_eq!(*x.downcast_ref_unchecked::<usize>(), 1);
}
Safety

The contained value must be of type T. Calling this method with the incorrect type is undefined behavior.

🔬This is a nightly-only experimental API. (downcast_unchecked)

Returns a mutable reference to the inner value as type dyn T.

Examples
#![feature(downcast_unchecked)]

use std::any::Any;

let mut x: Box<dyn Any> = Box::new(1_usize);

unsafe {
    *x.downcast_mut_unchecked::<usize>() += 1;
}

assert_eq!(*x.downcast_ref::<usize>().unwrap(), 2);
Safety

The contained value must be of type T. Calling this method with the incorrect type is undefined behavior.

Forwards to the method defined on the type dyn Any.

Examples
use std::any::Any;

fn is_string(s: &(dyn Any + Send)) {
    if s.is::<String>() {
        println!("It's a string!");
    } else {
        println!("Not a string...");
    }
}

is_string(&0);
is_string(&"cookie monster".to_string());

Forwards to the method defined on the type dyn Any.

Examples
use std::any::Any;

fn print_if_string(s: &(dyn Any + Send)) {
    if let Some(string) = s.downcast_ref::<String>() {
        println!("It's a string({}): '{}'", string.len(), string);
    } else {
        println!("Not a string...");
    }
}

print_if_string(&0);
print_if_string(&"cookie monster".to_string());

Forwards to the method defined on the type dyn Any.

Examples
use std::any::Any;

fn modify_if_u32(s: &mut (dyn Any + Send)) {
    if let Some(num) = s.downcast_mut::<u32>() {
        *num = 42;
    }
}

let mut x = 10u32;
let mut s = "starlord".to_string();

modify_if_u32(&mut x);
modify_if_u32(&mut s);

assert_eq!(x, 42);
assert_eq!(&s, "starlord");
🔬This is a nightly-only experimental API. (downcast_unchecked)

Forwards to the method defined on the type dyn Any.

Examples
#![feature(downcast_unchecked)]

use std::any::Any;

let x: Box<dyn Any> = Box::new(1_usize);

unsafe {
    assert_eq!(*x.downcast_ref_unchecked::<usize>(), 1);
}
Safety

Same as the method on the type dyn Any.

🔬This is a nightly-only experimental API. (downcast_unchecked)

Forwards to the method defined on the type dyn Any.

Examples
#![feature(downcast_unchecked)]

use std::any::Any;

let mut x: Box<dyn Any> = Box::new(1_usize);

unsafe {
    *x.downcast_mut_unchecked::<usize>() += 1;
}

assert_eq!(*x.downcast_ref::<usize>().unwrap(), 2);
Safety

Same as the method on the type dyn Any.

Forwards to the method defined on the type Any.

Examples
use std::any::Any;

fn is_string(s: &(dyn Any + Send + Sync)) {
    if s.is::<String>() {
        println!("It's a string!");
    } else {
        println!("Not a string...");
    }
}

is_string(&0);
is_string(&"cookie monster".to_string());

Forwards to the method defined on the type Any.

Examples
use std::any::Any;

fn print_if_string(s: &(dyn Any + Send + Sync)) {
    if let Some(string) = s.downcast_ref::<String>() {
        println!("It's a string({}): '{}'", string.len(), string);
    } else {
        println!("Not a string...");
    }
}

print_if_string(&0);
print_if_string(&"cookie monster".to_string());

Forwards to the method defined on the type Any.

Examples
use std::any::Any;

fn modify_if_u32(s: &mut (dyn Any + Send + Sync)) {
    if let Some(num) = s.downcast_mut::<u32>() {
        *num = 42;
    }
}

let mut x = 10u32;
let mut s = "starlord".to_string();

modify_if_u32(&mut x);
modify_if_u32(&mut s);

assert_eq!(x, 42);
assert_eq!(&s, "starlord");
🔬This is a nightly-only experimental API. (downcast_unchecked)

Forwards to the method defined on the type Any.

Examples
#![feature(downcast_unchecked)]

use std::any::Any;

let x: Box<dyn Any> = Box::new(1_usize);

unsafe {
    assert_eq!(*x.downcast_ref_unchecked::<usize>(), 1);
}
🔬This is a nightly-only experimental API. (downcast_unchecked)

Forwards to the method defined on the type Any.

Examples
#![feature(downcast_unchecked)]

use std::any::Any;

let mut x: Box<dyn Any> = Box::new(1_usize);

unsafe {
    *x.downcast_mut_unchecked::<usize>() += 1;
}

assert_eq!(*x.downcast_ref::<usize>().unwrap(), 2);

Trait Implementations§

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

Implementors§