2016-07-16 3 views
2

Я пытаюсь изучить erlang. Вот базовый сервер, который вычисляет площадь квадрата. Это модифицированная версия примера 6 erlang white papererlang - получение петли образец соответствия вопрос

Вот код:

-module(area_server). 
-export([start/0, loop/0]). 

start() -> 
    spawn(area_server, loop, []). 

loop() -> 
    receive 
     {Client, {square, X}} -> 
      Client ! X*X, 
      loop() 
    end. 

У меня есть проблема в том, что, кажется, я могу связать X только одно значение. Привязка к любому другому значению не работает. Чтобы проверить, у меня есть следующий код:

Server = area_server:start(). 

%Works and returns 100 
Server ! {self(), {square, 10}}, receive Area -> Area end. 

%Does not work and just does not return at all 
Server ! {self(), {square, 5}}, receive Area -> Area end. 

Так как я могу рассчитать квадрат 5?

+2

Хорошо. Похоже, проблема не в сервере, а в клиентском коде. так как я получаю переменную под названием «Область», и она привязана к 100 раз, после чего она не может быть привязана к 25. Поэтому, если я перейду на «Area1» во втором вызове, он будет работать. – arahant

ответ

2

Что происходит, так это то, что на втором запуске Area уже ограничен.

Когда вы делаете:

recieve Area -> Area end. 

Первый Area получает значение, а второй Area границы значение переменной (Area). Поэтому после первого звонка Area ограничено значением 100.
Как вы, возможно, уже знаете, Erlang - это единственный язык-ассистент. См. this и this для получения дополнительной информации.

Когда вы запускаете это во второй раз с той же переменной Area, он ждет по вызову receive, потому что нет соответствия. Значение, которое вы посылаете, равно 25, но Area внутри принимающей суммы уже ограничено 100, так что совпадения нет. Вот почему он просто висит там.

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

get_area(Server, Amount) -> 
    Server ! {self(), {square, Amount}}, receive Area -> Area end. 

, а затем в клиенте просто позвоните get_area(Server, 10) или get_area(Server, 5).

Смежные вопросы