2015-02-10 10 views
14

Tôi có thể xác định các hàm được đặt tên trong các mô-đun tốt, nhưng tôi chưa có được chức năng của nó để sử dụng trong bảng điều khiển iex> hoặc ex>.Làm cách nào để xác định các hàm được đặt tên trong bảng điều khiển Elixir mà không nhận được ** (ArgumentError) không thể gọi ra mô-đun bên ngoài def/2?

tôi tiếp tục nhận được lỗi sau khi tôi cố gắng chạy lệnh def:

(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) 

tôi có thể chạy này với elixir tốt, như sau:

$ elixir pprime.exs 

Tuy nhiên, trong bảng điều khiển, tôi dường như không thể làm bất cứ điều gì như vậy:

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 

Làm cách nào để xác định chức năng được đặt tên trong bảng điều khiển Elixir?

Điều này có thể thực hiện được không?

Tôi có cần tạo mô-đun đặc biệt để sử dụng trong bảng điều khiển Elixir không?

Trả lời

13

Câu trả lời ngắn gọn: Bạn không thể.

Câu trả lời dài: Tất cả mã trong Elixir tồn tại bên trong mô-đun vì nhiều tính năng Elixir, như trao đổi mã nóng, dựa vào việc có mô-đun làm vùng chứa mã. Đó là lý do tại sao bạn không thể định nghĩa các hàm bên ngoài các mô-đun (không có không gian tên có thể thay đổi toàn cục mà chúng có thể được thêm vào).

+1

Có thể thêm mô-đun cho bảng điều khiển Elixir để xác định chức năng không? –

+4

Có, bạn chỉ có thể lồng 'def' trong' defmodule', giống như trong tệp exs. –

+0

//, tôi ngửi thấy mùi hương ướt át, ẩm ướt của tóc yak, nhưng không phải mọi lang đều có thể hoặc nên là Python, tôi đoán vậy. –

14

Bạn có thể xác định mô-đun trong iex. Sao chép và dán chỉ hoạt động tốt:

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

Hoặc nếu bạn không muốn định nghĩa toàn bộ mô-đun, bạn có thể sử dụng các hàm ẩn danh: 'transform = fn (myvar) -> 8 * myvar + 3 end' và sau đó là' transform. (5) ' – tkowal

Các vấn đề liên quan