Git Product home page Git Product logo

Comments (2)

palkan avatar palkan commented on August 27, 2024 1

There is no difference in the behaviour since we use this blocks with define_method to create class instance methods.

There is a slightly difference in the way Ruby VM executes these blocks though.
If we take a look at the instructions sequences for both definitions, we could see that the return version is a little bit more complex:

# using a simplified example
class A
  define_method(:boon) do |val|
    next 2 if val
    1
  end

  define_method(:boor) do |val|
    return 2 if val
    1
  end

  def boo(val)
    return 2 if val
    val
  end
end

# with `next`
puts RubyVM::InstructionSequence.disasm(A.instance_method(:boon))

# == disasm: #<ISeq:block in <class:A>@(irb):18 (18,23)-(21,5)>===========
# == catch table
# | catch type: redo   st: 0001 ed: 0009 sp: 0000 cont: 0001
# | catch type: next   st: 0001 ed: 0009 sp: 0000 cont: 0009
# |------------------------------------------------------------------------
# local table (size: 1, argc: 1 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] val<Arg>   
# 0000 nop                                                              (  18)[Bc]
# 0001 getlocal_OP__WC__0 val                                           (  19)[Li]
# 0003 branchunless     7
# 0005 putobject_OP_INT2FIX_O_1_C_ 
# 0006 leave                                                            (  21)[Br]
# 0007 putobject        2                                               (  20)[Li]
# 0009 leave                                                            (  21)[Br]

# with `return`

puts RubyVM::InstructionSequence.disasm(A.instance_method(:boor))

# == disasm: #<ISeq:block in <class:A>@(irb):23 (23,23)-(26,5)>===========
# == catch table
# | catch type: redo   st: 0001 ed: 0014 sp: 0000 cont: 0001
# | catch type: next   st: 0001 ed: 0014 sp: 0000 cont: 0014
# |------------------------------------------------------------------------
# local table (size: 1, argc: 1 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] val<Arg>   
# 0000 nop                                                              (  23)[Bc]
# 0001 putself                                                          (  24)[Li]
# 0002 opt_send_without_block <callinfo!mid:vl, argc:0, FCALL|VCALL|ARGS_SIMPLE>, <callcache>
# 0005 branchunless     12
# 0007 putobject        2
# 0009 throw            1
# 0011 pop              
# 0012 putobject        2                                               (  25)[Li]
# 0014 leave                                                            (  26)[Br]

# explicit method definition is closer to the `next` version
puts RubyVM::InstructionSequence.disasm(A.instance_method(:boo))

# == disasm: #<ISeq:boo@(irb):13 (13,2)-(16,5)>===========================
# local table (size: 1, argc: 1 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
# [ 1] val<Arg>   
# 0000 getlocal_OP__WC__0 val                                           (  14)[LiCa]
# 0002 branchunless     6
# 0004 putobject_OP_INT2FIX_O_1_C_ 
# 0005 leave            [Re]
# 0006 putobject        2                                               (  15)[Li]
# 0008 leave                                                            (  16)[Re]

So, using next is a little (well, very-very-very little comparing to the Rails overhead 😉) efficient)

from action_policy.

louim avatar louim commented on August 27, 2024

Thank you for the detailed explanation!

from action_policy.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.