Использование yield и return в Ruby
может кто-нибудь помочь мне выяснить использование yield и return в Ruby. Я новичок Ruby, поэтому простые примеры высоко ценятся.
спасибо заранее!
3 ответов
оператор return работает так же, как и на других подобных языках программирования, он просто возвращается из метода, на котором он используется. Вы можете пропустить вызов return, так как все методы в ruby всегда возвращают последний оператор. Таким образом, вы можете найти такой метод:
def method
"hey there"
end
это на самом деле то же самое, что делать что-то вроде:
def method
return "hey there"
end
на yield
С другой стороны, удаляет блок, заданный в качестве параметра метода. Таким образом, вы можете иметь метод вот так:
def method
puts "do somthing..."
yield
end
а затем используйте его так:
method do
puts "doing something"
end
результатом этого будет печать на экране следующих 2 строк:
"do somthing..."
"doing something"
надеюсь, это немного проясняет ситуацию. Для получения дополнительной информации о блоках, вы можете проверить этой ссылке.
yield
используется для вызова блока, связанного с методом. Вы делаете это, помещая блок (в основном просто код в фигурные скобки) после метода и его параметров, например:
[1, 2, 3].each {|elem| puts elem}
return
выходит из текущего метода и использует его "аргумент" в качестве возвращаемого значения, например:
def hello
return :hello if some_test
puts "If it some_test returns false, then this message will be printed."
end
но обратите внимание, что вы не есть использовать ключевое слово return в любых методах; Ruby вернет последний оцененный оператор, если он не встретит возвращается. Таким образом, эти два equivelent:
def explicit_return
# ...
return true
end
def implicit_return
# ...
true
end
вот пример yield
:
# A simple iterator that operates on an array
def each_in(ary)
i = 0
until i >= ary.size
# Calls the block associated with this method and sends the arguments as block parameters.
# Automatically raises LocalJumpError if there is no block, so to make it safe, you can use block_given?
yield(ary[i])
i += 1
end
end
# Reverses an array
result = [] # This block is "tied" to the method
# | | |
# v v v
each_in([:duck, :duck, :duck, :GOOSE]) {|elem| result.insert(0, elem)}
result # => [:GOOSE, :duck, :duck, :duck]
и пример для return
, который я буду использовать для реализации метода, чтобы увидеть, является ли число С:
class Numeric
# Not the real meat of the program
def sum_of_squares
(to_s.split("").collect {|s| s.to_i ** 2}).inject(0) {|sum, i| sum + i}
end
def happy?(cache=[])
# If the number reaches 1, then it is happy.
return true if self == 1
# Can't be happy because we're starting to loop
return false if cache.include?(self)
# Ask the next number if it's happy, with self added to the list of seen numbers
# You don't actually need the return (it works without it); I just add it for symmetry
return sum_of_squares.happy?(cache << self)
end
end
24.happy? # => false
19.happy? # => true
2.happy? # => false
1.happy? # => true
# ... and so on ...
надеюсь, что это помогает! :)
def cool
return yield
end
p cool {"yes!"}
ключевое слово yield указывает Ruby выполнить код в блоке. В этом примере, блок возвращает строку "yes!"
. Явный оператор return использовался в cool()
метод, но это также могло быть неявным.