Из раздела Объявление ожиданий возвращаемого значения :
Можно установить ожидание для нескольких возвращаемых значений. Предоставляя последовательность возвращаемых значений, мы сообщаем Mockery, какое значение возвращать при каждом последующем вызове метода:
$mock = \Mockery::mock('MyClass'); $mock->shouldReceive('name_of_method') ->andReturn($value1, $value2, ...)
Первый вызов вернет $ value1, а второй вызов вернет $ value2. [114 ] BLOCKQUOTE>
защищенные
методы могут быть вызваны любым экземпляром определяющего класса или его подклассов.
частные
методы могут быть вызваны только из вызывающего объекта. Вы не можете напрямую получить доступ к закрытым методам другого экземпляра.
Вот краткий практический пример:
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
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
конец
Рассмотрим частный метод в 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, существует тенденция делать все доступным и доверять другим разработчикам, чтобы они не облажались.