19

Rubyでのyieldとreturnの使用法を理解するのを誰かが助けてくれますか?私はRubyの初心者なので、簡単な例を高く評価しています。

前もって感謝します!

4

3 に答える 3

38

returnステートメントは、他の同様のプログラミング言語で機能するのと同じように機能し、使用されているメソッドから戻るだけです。rubyのすべてのメソッドは常に最後のステートメントを返すため、returnの呼び出しをスキップできます。したがって、次のような方法が見つかる可能性があります。

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"

それが少しそれをクリアすることを願っています。ブロックの詳細については、このリンクを確認してください。

于 2012-05-04T14:54:40.670 に答える
8

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は、戻り値がない場合、評価された最後のステートメントを返します。したがって、これら2つは同等です。

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

お役に立てれば!:)

于 2012-05-04T14:50:40.050 に答える
1
def cool
  return yield
end

p cool {"yes!"}

yieldキーワードは、ブロック内のコードを実行するようにRubyに指示します。この例では、ブロックは文字列を返します"yes!"。メソッドで明示的なreturnステートメントが使用されましたcool()が、これも暗黙的である可能性があります。

于 2017-05-13T10:35:08.633 に答える