anchor.diff:  | 14 | `? :` | ternary conditional
   |    | `?:` | elvis operator
   | 15 | `=` &#160; `\**=` &#160; `*=` &#160; `/=` &#160; `%=` &#160; `+=` &#160; `-=` &#160; +
  -`pass:[<<=]` &#160; `>>=` &#160; `>>>=` &#160; `&=` &#160; `^=` &#160; `\|=` | various assignments
  +`pass:[<<=]` &#160; `>>=` &#160; `>>>=` &#160; `&=` &#160; `^=` &#160; `\|=` &#160; &#160; `?=` | various assignments
   |======================
   
   [[Operator-Overloading]]
  
positive.code: ----
  include::{projectdir}/src/spec/test/OperatorsTest.groovy[tags=simple_relational_op,indent=0]
  ----
  
  == Logical operators
  
  
negative.code: <5> using the subscript operator with index 1 allows retrieving the user name
  <6> we can use the subscript operator to write to a property thanks to the delegation to `putAt`
  <7> and check that it's really the property `name` which was changed
  
  === Safe index operator
  
  Groovy 3.0.0 introduces safe indexing operator, i.e. `?[]`, which is similar to `?.`. For example:
  
  [source,groovy]
  --------------------------------------
  String[] array = ['a', 'b']
  assert 'b' == array?[1]      // get using normal array index
  array?[1] = 'c'              // set using normal array index
  assert 'c' == array?[1]
  
  array = null
  assert null == array?[1]     // return null for all index values
  array?[1] = 'c'              // quietly ignore attempt to set value
  assert null == array?[1]
  
  def personInfo = [name: 'Daniel.Sun', location: 'Shanghai']
  assert 'Daniel.Sun' == personInfo?['name']      // get using normal map index
  personInfo?['name'] = 'sunlan'                  // set using normal map index
  assert 'sunlan' == personInfo?['name']
  
  personInfo = null
  assert null == personInfo?['name']              // return null for all map values
  personInfo?['name'] = 'sunlan'                  // quietly ignore attempt to set value
  assert null == personInfo?['name']
  --------------------------------------
  
  
  === Membership operator
  
  