Рассмотрим b = a + 7.

Как я могу заставить b идти в ногу с a, чтобы утверждение оставалось верным даже при изменении a со временем?

Не только это, но как я могу сделать так, чтобы это работало наоборот, обновляя a соответствующим образом, если b также изменится?

0
San Diago 31 Дек 2017 в 03:15

2 ответа

Лучший ответ

В Ruby нет такой вещи, как взаимно связывающие переменные. Для этого вы можете использовать анонимные функции (также известные как лямбды).

a = 0
b = -> {a + 7}
b.()  #=> 7

a = 100
b.()  #=> 107

Для меня это немного некрасиво, потому что b неявно зависит от a, что плохо для функционального программирования.

Вы также можете добиться этого с помощью традиционного объектно-ориентированного подхода, если вы не против использования obj.attr.

class Foo
  attr_accessor :a

  def b
    a + 7
  end
end

foo = Foo.new
foo.a = 0
foo.b  #=> 7
foo.a = 100
foo.b  #=> 107
2
Aetherus 31 Дек 2017 в 01:58

Вы можете использовать объекты Proc.

a = 1
b = a + 7 #=> 8

proc = Proc.new { b = a + 7  }        
 #=> #<Proc:0x0000000001038760@(irb):3>
a = 2
proc.call
b #=> 9

Краткий обзор procs и lambas здесь.

1
Sagar Pandya 31 Дек 2017 в 01:46