jnswtk
Strict and relaxed boolean operators
I know the difference between strict (and, or) and relaxed (&&, ||) operators, but when should I use them? Using && and || seems to be more versatile, but maybe it isn’t a good practice. What’s the convention?
Most Liked
al2o3cr
One situation where and and or are required: && and || aren’t allowed in guard clauses.
kartheek
docs state below:
As a rule of thumb, use
and,orandnotwhen you are expecting booleans. If any of the arguments are non-boolean, use&&,||and!.
One special trick which you can do with || is to assign default value when something is nil:
def id(opts) do
id_prefix = opts[:id_prefix] || "default_prefix"
#... do something.
end
|| becomes tricky for booleans when it is used for assigning default values :
def verify(id, opts) do
# this will result in a bug - validate_prefix? will not ever be false (for booleans)
validate_prefix? = opts[:validate_prefix] || true # this will result in a bug - validate_prefix? cannot be false
# do something
end
Calling verify/2 with opts , opts2, opts3:
# works good - validate_prefix? will be true
opts = %{validate_prefix: true}
verify("abc-123", opts)
# works good - true will be assigned (default value)
opts3 = %{}
verify("abc-123", opts1)
# bug - disabling prefix validation is not possible due to use of ||
opts2 = %{validate_prefix: false}
# this will be ignored and default value true will be assigned
# default value true will be assigned as false || true is always true
verify("abc-123", opts2)
joey_the_snake
you could possibly use it to perform an action that doesn’t require the value
value = get_some_value()
value && perform_some_action_only_if_value_is_not_nil()
value
something like this, I guess
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
- #code-sync
- #javascript
- #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








