kouluelixir
Initialising structs and incrementing value for each new struct
I am a beginner making a code with module. Employee module has a struct and a function. Employees have names, id’s, salaries and jobs. I have gotten updating jobs and salaries to work.
I still need for the employee id to update for each new employee. I also want to be able to assign a first and last name for each new employee. I tried to do that following this: https://inquisitivedeveloper.com/lwm-elixir-18/ (‘Packaging Struct Data and Functions’). But for some reason, it didn’t work, even if I copied their code.
Is this possible? Thank you in advance.
defmodule Employee do
defstruct firstName: "", lastName: "", id: 0, salary: 0, job: :none
def new() do
%Employee{}
end
def promote(employee) do
case employee.job do
:none -> employee = %{employee | job: :coder, salary: 2000}
:coder -> employee = %{employee | job: :designer, salary: 4000}
:designer -> employee = %{employee | job: :manager, salary: 6000}
:manager -> employee = %{employee | job: :ceo, salary: 8000}
end
end
def increment_id(employee) do
%Employee{employee | id: employee.id + 1}
end
end
employee = Employee.new("John", "Smith")
IO.puts("Employee name: #{employee.firstName} #{employee.lastName}. ID: #{employee.id}.
Job and salary: #{employee.job}, #{employee.salary}")
employee = Employee.promote(employee)
IO.puts("Employee name: #{employee.firstName} #{employee.lastName}. ID: #{employee.id}.
Job and salary: #{employee.job}, #{employee.salary}")
employee = Employee.promote(employee)
IO.puts("Employee name: #{employee.firstName} #{employee.lastName}. ID: #{employee.id}.
Job and salary: #{employee.job}, #{employee.salary}")
employee = Employee.demote(employee)
IO.puts("Employee name: #{employee.firstName} #{employee.lastName}. ID: #{employee.id}.
Job and salary: #{employee.job}, #{employee.salary}")
employee2 = Employee.new("Jane", "Doe")
IO.puts("Employee name: #{employee2.firstName} #{employee2.lastName}. ID: #{employee2.id}.
Job and salary: #{employee2.job}, #{employee2.salary}")
Marked As Solved
Matsa59
Hello, let’s explain step by step ![]()
employee = Employee.new("John", "Smith")
This line we call the function new/2 in a module called Employee. In your case this function doesn’t exist. You defined the function new/0 that doesn’t take any parameter.
So let’s update our code to have the right function:
defmodule Employee do
defstruct first_name: "", last_name: "", id: 0, salary: 0, job: :none
# Obviously you can call parameter without _var
# I just add it to clarify the code in the function
def new(first_name_var, last_name_var) do
%Employee{first_name: first_name_var, last_name: last_name_var}
end
def promote(employee) do
# ...
end
def increment_id(employee) do
# ...
end
end
in Elixir only modules names are in camel case, otherwise it’s in kebab case that’s why I changed
firstNametofirst_name.
If you have any other question just ask ![]()
Have a great day
edit : Try to create a function display/1 that take an employee as parameter. Then simply call Employee.display(employee) to execute the IO.puts/1 ![]()
The main objectives of Modules is to reduce the code size meaning when you can factor something, create a function.
Also Liked
tomkonidas
in Elixir only modules names are in camel case, otherwise it’s in kebab case that’s why I changed
firstNametofirst_name.
It is actually snake_case and not kebab-case ![]()
dom
There’s a nice tutorial on Agent: https://elixir-lang.org/getting-started/mix-otp/agent.html
More typically you’d just use a DB. If this is for testing or playing around, you can also use :erlang.unique_integer.
axelson
I would like to note that for a production system you’d probably want to generate the incrementing ids in the database.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #javascript
- #code-sync
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








