Использование доходности и доходности в Ruby

Может ли кто-нибудь помочь мне разобраться с использованием доходности и возврата в Ruby. Я начинаю Ruby, поэтому очень простые примеры приветствуются.

Заранее благодарю вас!

Ответ 1

Оператор 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

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

"do somthing..."
"doing something"

Надеюсь, что это немного очистит. Для получения дополнительной информации о блоках вы можете проверить эту ссылку.

Ответ 2

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 вернет последнее утверждение, если оно не встречает никаких возвратов. Таким образом, эти два являются равновероятными:

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, который я буду использовать для реализации метода, чтобы увидеть, является ли число happy:

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 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 ...

Надеюсь, это поможет!:)

Ответ 3

def cool
  return yield
end

p cool {"yes!"}

Ключевое слово yield указывает Ruby на выполнение кода в блоке. В этом примере блок возвращает строку "yes!". Явный оператор return использовался в методе cool(), но это также могло быть неявным.