{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### 10-1-2 オブジェクトが持つメソッドを調べる(続き)\n", "#### ■オブジェクトにメソッドが定義されているかを確認する" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "true\n" ] }, { "data": { "text/plain": [ "false" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class HasMethod\n", " def has_method\n", " 'has_method'\n", " end\n", "end\n", "\n", "class NotHaveMethod\n", "end\n", "\n", "has_method = HasMethod.new\n", "not_have_method = NotHaveMethod.new\n", "\n", "p has_method.respond_to? :has_method\n", "not_have_method.respond_to? :has_method" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "false\n", "true\n" ] }, { "data": { "text/plain": [ "false" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class HasPrivateMethod\n", " private\n", " def private_method\n", " 'private_method'\n", " end\n", "end\n", "\n", "has_private_method = HasPrivateMethod.new\n", "\n", "p has_private_method.respond_to? :private_method\n", "p has_private_method.respond_to? :private_method, true # give true for second argment\n", "has_private_method.respond_to? :private_method, false # give false for second argment" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\"respond_at_method_missing\"\n", "false\n" ] }, { "data": { "text/plain": [ "true" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class RespondAtMethodMissing\n", " def method_missing(method_name, *args)\n", " if method_name == :respond_at_method_missing\n", " 'respond_at_method_missing'\n", " else\n", " super\n", " end\n", " end\n", "end\n", "\n", "respond_at_method_missing = RespondAtMethodMissing.new\n", "p respond_at_method_missing.respond_at_method_missing\n", "\n", "p respond_at_method_missing.respond_to? :respond_at_method_missing\n", "\n", "class RespondAtMethodMissing\n", " def respond_to_missing?(method_name, include_private = false)\n", " if method_name.to_sym == :respond_at_method_missing\n", " true\n", " else\n", " super\n", " end\n", " end\n", "end\n", "\n", "respond_at_method_missing.respond_to? :respond_at_method_missing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### ■メソッドの呼び出し" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\"hi\"\n" ] }, { "data": { "text/plain": [ "\"hello takkanm\"" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class Hello\n", " def hi\n", " 'hi'\n", " end\n", " \n", " def hello(name)\n", " \"hello #{name}\"\n", " end\n", "end\n", "\n", "hello = Hello.new\n", "p hello.send :hi\n", "hello.send :hello, \"takkanm\"" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "ename": "ArgumentError", "evalue": "wrong number of arguments (given 1, expected 0)", "output_type": "error", "traceback": [ "\u001b[31mArgumentError\u001b[0m: wrong number of arguments (given 1, expected 0)", "\u001b[37m(pry):108:in `hi'\u001b[0m", "\u001b[37m(pry):120:in `
'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `eval'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `evaluate_ruby'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:355:in `handle_line'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:274:in `block (2 levels) in eval'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `catch'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `block in eval'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `catch'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `eval'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/backend.rb:66:in `eval'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/bin/iruby:5:in `'\u001b[0m", "\u001b[37mC:/Ruby24-x64/bin/iruby:23:in `load'\u001b[0m", "\u001b[37mC:/Ruby24-x64/bin/iruby:23:in `
'\u001b[0m" ] } ], "source": [ "hello.send :hi, \"foo\"" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"bye [\\\"btw\\\", \\\"who are you?\\\"]\"" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class Hello\n", " def bye(*args)\n", " \"bye #{args}\"\n", " end\n", "end\n", "\n", "hello.send :bye, \"btw\",\"who are you?\"" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "ename": "NoMethodError", "evalue": "protected method `protected_hello' called for #\nDid you mean? protected_methods", "output_type": "error", "traceback": [ "\u001b[31mNoMethodError\u001b[0m: protected method `protected_hello' called for #\nDid you mean? protected_methods", "\u001b[37m(pry):168:in `
'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `eval'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `evaluate_ruby'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:355:in `handle_line'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:274:in `block (2 levels) in eval'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `catch'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `block in eval'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `catch'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `eval'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/backend.rb:66:in `eval'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/bin/iruby:5:in `'\u001b[0m", "\u001b[37mC:/Ruby24-x64/bin/iruby:23:in `load'\u001b[0m", "\u001b[37mC:/Ruby24-x64/bin/iruby:23:in `
'\u001b[0m" ] } ], "source": [ "class Hello\n", " protected\n", " def protected_hello\n", " 'protected hello'\n", " end\n", " \n", " private\n", " def private_hello\n", " 'private hello'\n", " end\n", "end\n", "\n", "hello = Hello.new\n", "\n", "hello.protected_hello" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\"protected hello\"\n" ] }, { "ename": "NoMethodError", "evalue": "private method `private_hello' called for #\nDid you mean? private_methods", "output_type": "error", "traceback": [ "\u001b[31mNoMethodError\u001b[0m: private method `private_hello' called for #\nDid you mean? private_methods", "\u001b[37m(pry):171:in `
'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `eval'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:387:in `evaluate_ruby'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:355:in `handle_line'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:274:in `block (2 levels) in eval'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `catch'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:273:in `block in eval'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `catch'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/pry-0.12.2/lib/pry/pry_instance.rb:272:in `eval'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/backend.rb:66:in `eval'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/backend.rb:12:in `eval'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/kernel.rb:87:in `execute_request'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/kernel.rb:47:in `dispatch'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/kernel.rb:37:in `run'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/command.rb:70:in `run_kernel'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/lib/iruby/command.rb:34:in `run'\u001b[0m", "\u001b[37mC:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/iruby-0.3/bin/iruby:5:in `'\u001b[0m", "\u001b[37mC:/Ruby24-x64/bin/iruby:23:in `load'\u001b[0m", "\u001b[37mC:/Ruby24-x64/bin/iruby:23:in `
'\u001b[0m" ] } ], "source": [ "p hello.send :protected_hello\n", "\n", "hello.private_hello" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"private hello\"" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hello.send :private_hello" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\"send mail: takkanm@example.com\"\n" ] }, { "data": { "text/plain": [ "\"takkanm\"" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class MailSender\n", " attr_reader :from\n", " \n", " def initialize(from)\n", " @from = from\n", " end\n", " \n", " def send(to)\n", " \"send mail: #{to}\"\n", " end\n", "end\n", "\n", "mail_sender = MailSender.new(\"takkanm\")\n", "\n", "p mail_sender.send 'takkanm@example.com'\n", "mail_sender.__send__ :from" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "次回 \"10-2 クラスについて調べる\" から" ] } ], "metadata": { "kernelspec": { "display_name": "Ruby 2.4.1", "language": "ruby", "name": "ruby" }, "language_info": { "file_extension": ".rb", "mimetype": "application/x-ruby", "name": "ruby", "version": "2.4.1" } }, "nbformat": 4, "nbformat_minor": 2 }