2015-02-10 8 views
14

मैं मॉड्यूल में नामित फ़ंक्शंस को ठीक से परिभाषित कर सकता हूं, लेकिन मुझे अभी तक आईईएक्स> या एक्स> कंसोल में उपयोग के लिए इसका लटका नहीं मिला है। इस प्रकारमैं ** (ArgumentError) के बिना Elixir कंसोल में नामित फ़ंक्शंस को परिभाषित कैसे कर सकता हूं मॉड्यूल के बाहर def/2 का आह्वान नहीं कर सकता?

(ArgumentError) cannot invoke def/2 outside module 

pprime.exs

IO.puts "initial division test" 

defmodule Expand do 
    def transform(myvar) do 
     8 * myvar + 3; 
    end 
end 

div2 = fn inputnum -> 
    [:a, inputnum/2.0, inputnum/3, inputnum/5.0, inputnum/7] 
end 

output = div2.(20.1) 

मैं अमृत ठीक के साथ इस चला सकते हैं,:

मैं निम्नलिखित त्रुटि मिलती रहती है जब मैं डीईएफ़ आदेश चलाने का प्रयास

$ elixir pprime.exs 

हालांकि, कंसोल में, मुझे ऐसा कोई प्रतीत नहीं होता है:

Erlang/OTP 17 [erts-6.3] [source] [64-bit] [async-threads:10] [kernel-poll:false] 

Interactive Elixir (1.0.2) - press Ctrl+C to exit (type h() ENTER for help) 
iex(1)> def transform(myvar) do 8 * myvar + 3; end 
** (ArgumentError) cannot invoke def/2 outside module 
    (elixir) lib/kernel.ex:3556: Kernel.assert_module_scope/3 
    (elixir) lib/kernel.ex:2816: Kernel.define/4 
    (elixir) expanding macro: Kernel.def/2 
    (elixir) iex:1: :elixir_compiler.__FILE__/2 

मैं एलिक्सीर कंसोल में नामित फ़ंक्शन को कैसे परिभाषित कर सकता हूं?

क्या यह भी संभव है?

क्या मुझे एलिक्सीर कंसोल में उपयोग करने के लिए एक विशेष मॉड्यूल बनाने की आवश्यकता है?

उत्तर

13

संक्षिप्त उत्तर: आप नहीं कर सकते।

लंबा उत्तर: एलिक्सीर में सभी कोड मॉड्यूल के अंदर मौजूद हैं क्योंकि हॉट कोड स्वैपिंग जैसी कई एलीक्सिर विशेषताएं कोड कोड कंटेनर के रूप में मॉड्यूल रखने पर निर्भर करती हैं। यही कारण है कि आप मॉड्यूल के बाहर फ़ंक्शंस को परिभाषित नहीं कर सकते हैं (कोई ग्लोबल, म्यूटेबल नेमस्पेस नहीं है जिसे वे जोड़ा जा सकता है)।

+1

क्या कोई फ़ंक्शन को परिभाषित करने के लिए एलिक्सीर कंसोल के लिए मॉड्यूल जोड़ सकता है? –

+4

हां, आप बस 'def' मॉड्यूल' में 'def' को घोंसला कर सकते हैं, जैसे कि exs फ़ाइल में। –

+0

//, मैं यक बालों की बेहोशी, गीली खुशबू गंध करता हूं, लेकिन मुझे लगता है कि हर लैंग पाइथन नहीं हो सकता है या नहीं। –

14

आप ओईएक्स में मॉड्यूल को परिभाषित कर सकते हैं। कॉपी और पेस्ट ठीक काम करता है:

iex(1)> defmodule Expand do 
...(1)>  def transform(myvar) do 
...(1)>   8 * myvar + 3; 
...(1)>  end 
...(1)> end 
iex(2)> Expand.transform(12) 
99 
iex(3)> defmodule Expand do 
...(3)>  def transform(myvar) do 
...(3)>   3 * myvar + 5 
...(3)>  end 
...(3)> end 
iex:3: warning: redefining module Expand 
iex(4)> Expand.transform(12) 
41 
+4

या यदि आप पूरे मॉड्यूल को परिभाषित नहीं करना चाहते हैं, तो आप अनाम कार्यों का उपयोग कर सकते हैं: 'transform = fn (myvar) -> 8 * myvar + 3 end' और फिर 'transform। (5)' – tkowal

संबंधित मुद्दे

 संबंधित मुद्दे