Почему в Ruby есть как закрытые, так и защищенные методы?

Из раздела Объявление ожиданий возвращаемого значения :

Можно установить ожидание для нескольких возвращаемых значений. Предоставляя последовательность возвращаемых значений, мы сообщаем Mockery, какое значение возвращать при каждом последующем вызове метода:

$mock = \Mockery::mock('MyClass');
$mock->shouldReceive('name_of_method')
    ->andReturn($value1, $value2, ...)

Первый вызов вернет $ value1, а второй вызов вернет $ value2. [114 ] BLOCKQUOTE>

134
задан Andrew Grimm 27 March 2012 в 23:05
поделиться

3 ответа

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

частные методы могут быть вызваны только из вызывающего объекта. Вы не можете напрямую получить доступ к закрытым методам другого экземпляра.

Вот краткий практический пример:

def compare_to(x)
 self.some_method <=> x.some_method
end

some_method не может быть частным здесь. Он должен быть защищен , потому что он нужен для поддержки явных получателей. Типичные внутренние вспомогательные методы обычно могут быть частными , поскольку их никогда не нужно вызывать таким образом.

Важно отметить, что это отличается от того, как работает Java или C ++. private в Ruby аналогичен protected в Java / C ++ в том, что подклассы имеют доступ к методу. В Ruby нет способа ограничить доступ к методу из его подклассов, как в Java с private .

Видимость в Ruby в любом случае является в основном «рекомендацией», поскольку вы всегда можете получить доступ к методу, используя send :

irb(main):001:0> class A
irb(main):002:1>   private
irb(main):003:1>   def not_so_private_method
irb(main):004:2>     puts "Hello World"
irb(main):005:2>   end
irb(main):006:1> end
=> nil

irb(main):007:0> foo = A.new
=> #<A:0x31688f>

irb(main):009:0> foo.send :not_so_private_method
Hello World
=> nil
153
ответ дан 23 November 2019 в 23:55
поделиться
First Three types of access specifiers and those define thier scope.
1.Public    ->  Access anywhere out side the class.
2.Private   ->  Can not access outside the class. 
3.Protected ->  This Method not access anywhere this method define 
                scope.

But i have a solution for this problem for all method how to access explain in depth. 

class Test
attr_reader :name
def initialize(name)
  @name = name
end

def add_two(number)
  @number = number 
end

def view_address
  address("Anyaddress")
end

private 
def address(add)
   @add = add
end

protected 
def user_name(name)
  # p 'call method'
  @name = name
end

конец

class Result < Test
def new_user
  user_name("test355")
end

конец

  1. Список объектов
  2. p тестируют = Test.new ("тест")
  3. тест add_two p test.name
  4. p (3)
  5. элемент списка
  6. тест view_address p
  7. p r = Result.new ("")
  8. p r.new_user
0
ответ дан 23 November 2019 в 23:55
поделиться

Рассмотрим частный метод в Java. Конечно, он может быть вызван из того же класса, но он также может быть вызван другим экземпляром того же класса:

public class Foo {

   private void myPrivateMethod() {
     //stuff
   }

   private void anotherMethod() {
       myPrivateMethod(); //calls on self, no explicit receiver
       Foo foo = new Foo();
       foo.myPrivateMethod(); //this works
   }
}

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

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

С другой стороны, я определенно должен отметить, что в сообществе Ruby довольно распространено вообще не использовать эти элементы управления видимостью, учитывая, что Ruby в любом случае дает вам способы их обойти. В отличие от мира Java, существует тенденция делать все доступным и доверять другим разработчикам, чтобы они не облажались.

7
ответ дан 23 November 2019 в 23:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: