मूल रूप से, वहाँ इस सवाल का दो भागों हैं:क्या जंग मैक्रोज़ का उपयोग कर प्रक्रियाओं को घोषित करना संभव है?
आप Rust में किसी मैक्रो को एक अज्ञात पहचानकर्ता पारित कर सकते हैं?
क्या आप जंग मैक्रो में नए चर नामों को उत्पन्न करने के लिए तारों को जोड़ सकते हैं? !
उदाहरण के लिए, कुछ की तरह:
macro_rules! expand(
($x:ident) => (
let mut x_$x = 0;
)
)
कॉलिंग का विस्तार (hi) स्पष्ट विफल रहता है क्योंकि हाय एक अज्ञात पहचानकर्ता होता है लेकिन क्या आप इसे किसी भी तरह से कर सकते हैं?
यानी। कुछ की तरह सी में समतुल्य:
#include <stdio.h>
#define FN(Name, base) \
int x1_##Name = 0 + base; \
int x2_##Name = 2 + base; \
int x3_##Name = 4 + base; \
int x4_##Name = 8 + base; \
int x5_##Name = 16 + base;
int main() {
FN(hello, 10)
printf("%d %d %d %d %d\n", x1_hello, x2_hello, x3_hello, x4_hello, x5_hello);
return 0;
}
आप क्यों कहते हैं, क्या एक भयानक विचार है। आप कभी ऐसा क्यों करना चाहते हैं?
मुझे खुशी है कि आपने पूछा!
इस जंग ब्लॉक पर विचार करें:
{
let marker = 0;
let borrowed = borrow_with_block_lifetime(data, &marker);
unsafe {
perform_ffi_call(borrowed);
}
}
अब आप एक स्पष्ट घिरे जीवन (मार्कर) के साथ एक उधार मूल्य है कि एक संरचना जीवन भर का उपयोग नहीं है, लेकिन हम गारंटी ले सकते हैं कि के संपूर्ण दायरे के लिए मौजूद है एफएफआई कॉल; साथ ही हम अस्पष्ट त्रुटियों में नहीं भागते हैं, जहां *
एक असुरक्षित ब्लॉक के अंदर असुरक्षित रूप से डी-रेफरेंस किया गया है और इसलिए संकलक को एक सुरक्षित ब्लॉक के अंदर त्रुटि के बावजूद त्रुटि के रूप में नहीं पकड़ता है।
उपयोग मैक्रो इस उद्देश्य के काफी मुसीबतों मैं संकलक के साथ लड़ रहे है कम होगा के लिए अस्थायी चर घोषणा कर सकते हैं (यह भी Why are all my pointers pointing to the same place with to_c_str() in rust? देखें)
। यही कारण है कि मैं यह करना चाहता हूँ।
#![feature(concat_idents)]
macro_rules! test {
($x:ident) => ({
let z = concat_idents!(hello_, $x);
z();
})
}
fn hello_world() { }
fn main() {
test!(world);
}
हालांकि, जहां तक मुझे पता है क्योंकि concat_idents!()
अपने आप में एक मैक्रो है:
concat_idents मुझे हटा सकता है, यह पहले से ही फीचर-गेटेड [# 13295] (https://github.com/mozilla/rust/pull/13295) और [# 13294] (https://github.com/mozilla)/जंग/मुद्दे/13294) – Arjan
हमें वास्तव में सी ## के समान इस सुविधा की आवश्यकता है। मुझे लगातार मैक्रोज़ लिखना पड़ता है जहां उपयोगकर्ता मुझे दो नाम देते हैं क्योंकि स्ट्रिंग कॉन्सैट इतनी सीमित है। –