dynamic - अमृत ​​- स्ट्रिंग-नाम से मॉड्यूल पर कॉल विधि




module load (2)

मैं आम तौर पर अमृत और कार्यात्मक प्रोग्रामिंग भाषाओं के लिए नया हूँ

अमृत ​​में, मैं मॉड्यूल पर एक विशिष्ट फ़ंक्शन कॉल करना चाहता हूं, जो कि स्ट्रिंग के रूप में मॉड्यूल नाम दिया गया है।

मुझे निम्न (बहुत बुरे) कोड काम कर रहा है, जो बहुत कुछ करता है जो मैं चाहता हूं:

module_name = elem(elem(Code.eval_file("module.ex", __DIR__), 0), 1)
apply(module_name, :helloWorld, [])

यह (कम से कम मैं इसे समझता हूं) वर्तमान निर्देशिका में मॉड्यूल.एक्स के (पहले से संकलित) मॉड्यूल को संकलित करता है। मैं मॉड्यूल नाम निकालना (एक स्ट्रिंग के रूप में नहीं, यह पता नहीं है कि यह वास्तव में कौन से डेटा-प्रकार है) दो ट्यूपल्स से बाहर है और विधि को चलाने के लिए helloWorld पर helloWorld

इस कोड के साथ दो समस्याएं हैं:

  1. यह एक चेतावनी प्रिंट करता है जैसे redefining module Balance । मैं निश्चित रूप से उत्पादन में ऐसा नहीं करना चाहता।

  2. AFAIK यह कोड module.ex संकलित करता है। लेकिन जैसा कि मॉड्यूल.एक्स पहले ही संकलित और लोड हो चुका है, ऐसा नहीं होना चाहिए।

मुझे इन मॉड्यूल पर फ़ाइल नाम से तरीकों को कॉल करने की आवश्यकता नहीं है, मॉड्यूल-नाम भी ठीक होगा। लेकिन गतिशील द्वारा ऐसा करना पड़ता है, उदा। कमांड लाइन पर "बुक" दर्ज करना, जांच के बाद कि क्या मॉड्यूल मौजूद है, फ़ंक्शन Book.helloWorldBook.helloWorld

धन्यवाद।


खैर, वह कहां से पूछता है कि मदद करता है: आप अपने आप को वह मिनट समझेंगे जो आप पूछते हैं। ;)

बस का उपयोग कर apply(String.to_existing_atom("Elixir.Module"), :helloWorld, []) अब। (शायद नाम "मॉड्यूल" की अनुमति नहीं है, पता नहीं है)


यह भी ध्यान रखें कि एक मॉड्यूल का नाम एक परमाणु है जिससे String.to_existing_atom . String.to_existing_atom को आमतौर पर जरूरत नहीं है। इस कोड पर विचार करें:

defmodule T do
  def first([]), do: nil
  def first([h|t]), do: h
end

इस मामले में आप बस इस फैशन में लागू कर सकते हैं:

apply(T,:first,[[1,2,3]])
#=> 1 

या इस उदाहरण (नीचे दी गई सूची अमृत सूची मॉड्यूल है):

apply(List,:first,[[1,2,3]]) 
#=> 1

मेरा मतलब है कि यदि आप मॉड्यूल का नाम जानते हैं, तो उसे स्ट्रिंग के रूप में पास करने के लिए आवश्यक नहीं है और फिर स्ट्रिंग को मौजूदा परमाणु में परिवर्तित करना आवश्यक है। बस नाम उद्धरण चिह्नों के बिना उपयोग करें