Question

def est maintenant renvoyé le nom de la méthode.Afin que vous puissiez écrire

private def foo
  p "foo is private"
end

Mais j'avais une erreur avec une méthode plus difficile:

2.1.1p2 :036 >   private def refresh_prices
2.1.1p2 :037?>       orders = order_items.includes(:book)
2.1.1p2 :038?>       sum = 0
2.1.1p2 :039?>       orders.each do |t|
2.1.1p2 :040 >             t.price = t.book.price
2.1.1p2 :041?>           sum += t.price * t.quantity
2.1.1p2 :042?>           t.save
2.1.1p2 :043?>         end
2.1.1p2 :044?>       self.total_price = sum
2.1.1p2 :045?>       save
2.1.1p2 :046?>     end
SyntaxError: (irb):39: syntax error, unexpected keyword_do_block, expecting keyword_end
    orders.each do |t|
                  ^

sans privé ce def renvoie: rafraîchissez_prices.Quelqu'un peut-il expliquer pourquoi il échoue et est-ce un mauvais moyen d'utiliser privé def?

Était-ce utile?

La solution

C'est intéressant.On dirait que le bloc DO / End provoque une erreur de syntaxe.

Si vous utilisez le bloc de style généracodageCode, cela fonctionne comme prévu.

private def refresh_prices
          orders = order_items.includes(:book)
          sum = 0
          orders.each { |t|
            t.price = t.book.price
            sum += t.price * t.quantity
            t.save
          }
          self.total_price = sum
          save
        end
# => Object 

Je crois que cela pourrait être considéré comme un bug.Je verrai s'il y a un rapport sur le tracker de bogues Ruby.


EDIT: Je confirme que c'est un bug ruby 2.1 (voir #9308 ).Il a été corrigé dans la version actuelle Rubis, elle sera donc disponible dans la prochaine version de la bugfix.

Pour l'instant, utilisez simplement le style de bloc GeneraCoDiCodeTagcode au lieu de do / fin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top