{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## 9-2 MethodクラスとUnboundMethodクラス\n", "### 9-2-1 UnboundMethodオブジェクトを作る方法" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "#" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Array.instance_method(:shift)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "#" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[].method(:shift).unbind" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "true" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Array.instance_method(:shift) === [].method(:shift).unbind" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "[[:req]]\n", "Array\n" ] }, { "data": { "text/plain": [ ":<<" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "unbound_shift_operator = Array.instance_method(:<<)\n", "p unbound_shift_operator.arity\n", "p unbound_shift_operator.parameters\n", "p unbound_shift_operator.owner\n", "unbound_shift_operator.name" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "unbind_shift = [].method(:shift).unbind\n", "unbind_shift.bind([1, 2, 3])\n", "unbind_shift.bind([1, 2, 3]).call" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SuperKlass\n", "Klass\n" ] }, { "ename": "TypeError", "evalue": "bind argument must be an instance of SuperKlass", "output_type": "error", "traceback": [ "\u001b[31mTypeError\u001b[0m: bind argument must be an instance of SuperKlass", "\u001b[37m
:24:in `bind'\u001b[0m", "\u001b[37m
:24:in `
'\u001b[0m", "\u001b[37m/Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/backend.rb:44:in `eval'\u001b[0m", "\u001b[37m/Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/backend.rb:44:in `eval'\u001b[0m", "\u001b[37m/Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval'\u001b[0m", "\u001b[37m/Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request'\u001b[0m", "\u001b[37m/Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch'\u001b[0m", "\u001b[37m/Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run'\u001b[0m", "\u001b[37m/Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel'\u001b[0m", "\u001b[37m/Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run'\u001b[0m", "\u001b[37m/Users/ariga/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/iruby-0.3/bin/iruby:5:in `'\u001b[0m", "\u001b[37m/Users/ariga/.rbenv/versions/2.5.1/bin/iruby:23:in `load'\u001b[0m", "\u001b[37m/Users/ariga/.rbenv/versions/2.5.1/bin/iruby:23:in `
'\u001b[0m" ] } ], "source": [ "class SuperKlass\n", " def super_method\n", " self.class\n", " end\n", "end\n", "\n", "class Klass < SuperKlass\n", "end\n", "\n", "class NotInheritKlass\n", " def super_method\n", " self.class\n", " end\n", "end\n", "\n", "super_klass = SuperKlass.new\n", "klass = Klass.new\n", "not_inherit_klass = NotInheritKlass.new\n", "\n", "unbind_super_method = SuperKlass.instance_method(:super_method)\n", "p unbind_super_method.bind(super_klass).call\n", "\n", "p unbind_super_method.bind(klass).call\n", "\n", "unbind_super_method.bind(not_inherit_klass).call" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "次回、「9-3 MethodオブジェクトとProc」から" ] } ], "metadata": { "kernelspec": { "display_name": "Ruby 2.5.1", "language": "ruby", "name": "ruby" }, "language_info": { "file_extension": ".rb", "mimetype": "application/x-ruby", "name": "ruby", "version": "2.5.1" } }, "nbformat": 4, "nbformat_minor": 2 }