что такое локальный охват? - PullRequest
       15

что такое локальный охват?

2 голосов
/ 06 августа 2011

Если честно, я все еще путал переменную экземпляра и локальную переменную, не уверенный, какую именно следует использовать.

я знаю только одно условие о локальной переменной, которое нельзя использовать:

class MyClass
  def initialize
    local_var = 1
    @instance_var = 1
  end

  def show_local_var
   local_var
  end

  def show_instance_var
   @instance_var
  end
end

очевидно, MyClass.new.show_instance_var работает, а MyClass.new_show_local_var не

другая особенность двух типов переменных заключается в том, что блок, кажется, имеет одну и ту же локальную область видимости, поэтому на локальную переменную можно ссылаться:

local_var = 1

3.times do
  puts local_var
end

Есть все, что я знаю о различиях, есть ли другие доступные? пожалуйста, дайте мне знать

если есть какие-то статьи по этому поводу, это было бы так полезно для меня,

Ответы [ 3 ]

2 голосов
/ 06 августа 2011

Локальная переменная используется «прямо здесь и сейчас», и к ней нельзя получить доступ откуда-либо еще.

class MyClass
  def foo
    local_var = 2
    #I use this to do some sort of calculation
    @instance_var = local_var + 34
    local_var = 5 * @instance_var
    puts local_var
  end
  # From here, local_var is unaccessible.
end

После выхода из области видимости (foo s endпройдено) local_var больше не существует и на него нельзя ссылаться.

Переменная экземпляра доступна для всего класса в любое время.

class MyClass
  def initialize
    @instance_var = 0
  end

  def foo
    local_var = 2
    #I use this to do some sort of calculation
    @instance_var = local_var + 34
  end

  def some_operation
    if @instance_var == 36
      @instance_var = 3
    else
      @instance_var = 1
    end
  end
end

Поэтому, когда вы вызываете m = MyClass.new и позже m.some_operation, он работает с тем же @instance_var.

. И пока мы здесь, есть также переменные класса (определенные @@class_var), которые доступны из любой экземпляр класса.

У меня нет конкретной статьи, чтобы предоставить вам, но некоторые прибегая к помощи ruby variable scope и по каждому типу переменной независимо должны предоставить вам всю необходимую информацию!

2 голосов
/ 06 августа 2011

Второй пример, который вы описываете, называется Closure .Павел довольно неплохо объясняет это:

Закрытие - это блок кода, отвечающий трем критериям:

  • . Его можно передавать как значение и
  • может ссылаться на переменные из контекста, в котором оно было создано (то есть оно закрыто относительно доступа к переменным в математическом смыслеслово "закрыто").

Для быстрого ознакомления с доступными областями действия в Ruby вы можете обратиться к Ruby Programming wikibook .

Существует

  • Локальная область
  • Глобальная область
  • Область экземпляра
  • Область класса

"Область по умолчанию ", как это иногда упоминается при выполнении кода без модификаторов области, окружающих его, как в

@iv = "Who do I belong to?"

- область действия основного объекта.

1 голос
/ 06 августа 2011

Локальная область действия ограничена местоположением, в котором объявлена ​​переменная, то есть функция или цикл for, но к ней нельзя получить доступ из-за пределов этого местоположения. Однако, если вы вложите другие конструкции в функцию, цикл и т. Д., То внутренние конструкции могут получить доступ к локальной переменной. Переменные экземпляра ограничены экземпляром класса.

Статья о переменной области ruby ​​

Статья об области применения в целом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...