jnswtk

jnswtk

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?

Showing Posts 1 to 7

kartheek

kartheek

docs state below:

As a rule of thumb, use and , or and not when 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)
al2o3cr

al2o3cr

One situation where and and or are required: && and || aren’t allowed in guard clauses.

kartheek

kartheek

Like || can be used to check for nil and assign default values - can && be used for anything else?

One thing it can be used for raise /throw.

true && raise(ArgumentError)
false || raise(ArgumentError)
nil || raise(ArgumentError)
joey_the_snake

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

jnswtk

jnswtk OP

Thanks for all replies. So which one do you prefer or which one do you use more often?

kartheek

kartheek

As both (strict, relaxed) are not substitutes for one another - it depends on the restrictions they come with ?

Aetherus

Aetherus

Something I’ve done recently with :gen_tcp:

# The terminate callback in a GenServer
def terminate(_reason, socket) do
  socket && :gen_tcp.shutdown(socket, :read_write)
end
— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
RemyXRenard
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
samoloth
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
FlyingNoodle
If a change or preparation module uses Ash.Changeset.get_argument/2 or Ash.Query.get_argument/2 (or any of the other get_argument functio...
New
ryanwinchester
apply_graft/2 doesn’t rewrite an add_many sub-workflow’s deps on an add step. Grafted jobs cancel with “upstream job was deleted” Version...
New

Other Trending Topics Top

mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews