2016-11-30 6 views
1

У меня только два вопроса :)FunctionClauseError при вызове: wxFrame.new от эликсира

  1. Что случилось?
  2. Как я понимаю, что не так, не спрашивая о Stackoverflow?

Elixir код:

import WxConstants 
... 
wx = :wx.new 
frame = :wxFrame.new(wx, wxID_ANY, "Game of Life", size: {500, 500}) 

Выход:

** (FunctionClauseError) no function clause matching in :wxFrame.new/4 
    gen/wxFrame.erl:111: :wxFrame.new({:wx_ref, 0, :wx, []}, -1, "Game of Life", [size: {500, 500}]) 

WxConstants модуль: https://github.com/ElixirWin/wxElixir

+4

Попробуйте одинарные кавычки вокруг «Игры жизни» вместо двойного. – Dogbert

+0

Wow не думал, что кто-то даже знал, что github repo был там, кроме меня. –

+0

@OnorioCatenacci Google выполняет свою работу;) Спасибо за модуль. – raacer

ответ

5

Dogbert уже ответили на первый вопрос, я бы ответил второй.

** (FunctionClauseError) нет пункта функции согласования в ...

является одним из наиболее часто происходят ошибок в эликсире, а также любой другой языке поддержки шаблона в функциональных положениях. Рассмотрим этот надуманный пример:

defmodule M do 
    def test(param) when is_binary(param), do: "binary" 
    def test(param) when is_list(param), do: "list" 
end 
M.test("Hello, world") 
#⇒ "binary" 
M.test([1, 2, 3]) 
#⇒ "list" 

Когда нет никакого пункта функции, которые могут быть сопоставлены с заданными параметрами, ошибка выше происходит:

M.test(42) 
#⇒ ** (FunctionClauseError) no function clause matching in M.test/1 

Тем не менее, библиотека, которую вы используете, ожидаемый другой тип (ы) одного или многих параметров. Давайте проверим: :wxFrame.new/4 ожидает:

Parent = wxWindow:wxWindow() 
Id = integer() 
Title = unicode:chardata() 
Option = {pos, {X::integer(), Y::integer()}} | 
     {size, {W::integer(), H::integer()}} | 
     {style, integer()} 

Третий параметр, как ожидается, будет unicode:chardata(), который, в свою очередь Erlang charlist, что обозначается в эликсира одинарные кавычки. Отсюда комментарий @Dogbert: используйте одинарные кавычки вокруг 'Game of Life'.

+2

Но 'unicode: chardata()' разрешает 'binary()', поэтому он выглядит как ошибка в документации: http://erlang.org/doc/man/unicode.html#type-chardata. – Dogbert

+1

@ Догберт действительно; в любом случае ['new/4' имеет' is_chardata' guard] (https://github.com/erlang/otp/blob/maint/lib/wx/src/gen/wxFrame.erl#L112) и пытается явно конвертировать список в двоичные две строки ниже. – mudasobwa