constcat icon indicating copy to clipboard operation
constcat copied to clipboard

Const Char

Open Pspritechologist opened this issue 1 year ago • 1 comments

Although the concat! macro seems to work fine on char literals (concat!('h', 'e', 'l', 'l', 'o')), it won't seem to accept a const char. Example:

use constcat::concat;

const MARK: char = '?';
const QUESTION: &'static str = concat!("Why doesn't this work", MARK);

provides the error: no method named 'as_bytes' found for type 'char' in the current scope.

Is there any chance to solve this?

Pspritechologist avatar Oct 04 '24 09:10 Pspritechologist

This would be cool to have but I don't think it is a simple fix 🤔. You will have to use const MARK: &'static str = "?" for now.

Some issues:

  • We would need to convert a char in a const context to a byte slice (&[u8]). Static strings can be trivially converted using .as_bytes(), but char is a bit more complex. It seems like you can do it like this, which does not work in a const context yet. 🤯 not sure if there is a better way? Edit: it seems like encode_utf8 supports const in Rust 1.83!
const c: char = '?';

let mut buf = [0u8; 4];
c.encode_utf8(&mut buf);    
let as_bytes = &buf.as_slice()[..c.len_utf8()];
  • The macro needs to be able to handle both types of values. Usually the way to do this is with a trait, but again this has to be done in a const context and const trait methods are not yet supported in Rust.

rossmacarthur avatar Oct 05 '24 12:10 rossmacarthur