Comments (2)
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.
Thank you for the detailed explanation!
from action_policy.
Related Issues (20)
- Authorizing fields based on params_filter HOT 1
- Unknown policy scope type :active_record_relation HOT 3
- Policy-generator not working with Ruby 3.2 HOT 1
- uninitialized constant ActionController::Parameters HOT 4
- I18n does not seem to work with I18n Active Record HOT 1
- How Do I Test Resource-less Authorize? HOT 1
- Add --parent option to policy generator HOT 2
- Update a documentation about #be_an_alias_of matcher HOT 2
- Documentation Contrast HOT 3
- Can't alias `create?` to `manage?` HOT 1
- Cannot use `controller_authorize_current_user` with `ActionPolicy::Base` HOT 1
- Rspec fails with v0.6.6 when `eager_load` is set to `true` HOT 13
- 0.6.7 breaks wrap_parameters HOT 3
- Policy lookup for authorized_scope returns default policy instead of using implicit authorization target HOT 3
- Add `with_context` qualifier to `have_authorized_scope` matcher. HOT 1
- Allow using callable objects as scopes HOT 1
- Migrate pretty print to Prism
- Allow to reset authorization context HOT 7
- Error using callable Class as relation_scope HOT 8
- How to test pre_checks HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from action_policy.