{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Part 3 メタプログラミング\n", "# 6章 Rubyのクラスオブジェクト\n", "# 6-1 Classクラスからクラスを作る" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "class FirstClass\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-1-1 Classクラス" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[Class, Module, Object, Kernel, BasicObject]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Class.ancestors" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[:new, :allocate, :superclass]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Class.instance_methods(false)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Module" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Class.superclass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-1-2 Class.new" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "
: warning: already initialized constant FirstClass\n" ] }, { "data": { "text/plain": [ "FirstClass2" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "FirstClass = Class.new\n", "FirstClass2 = Class.new" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"FirstClass2\"" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "first_class_instance = FirstClass2.new\n", "first_class_instance.class.name" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-1-3 クラスの継承" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "FirstClass" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "SecondClass = Class.new(FirstClass)\n", "SecondClass.superclass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-1-4 メソッドを定義する" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "true\n", "#\n" ] }, { "data": { "text/plain": [ ":hello" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "klass_object = nil\n", "\n", "ThirdClass = Class.new do |klass|\n", " klass_object = klass\n", " klass == self\n", " \n", " def hello\n", " :hello\n", " end\n", "end\n", "\n", "p klass_object == ThirdClass\n", "\n", "p third_class_instance = ThirdClass.new\n", "third_class_instance.hello" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "#" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tci = klass_object.new" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ":hello" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tci.hello" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-1-5 クラス名の無いクラス" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "nil\n" ] } ], "source": [ "klass = Class.new\n", "p klass.name" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "#\n" ] }, { "data": { "text/plain": [ "#" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "obj = klass.new\n", "p obj.class" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"NamedClass\"" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "NamedClass = klass\n", "klass.name" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"NamedClass\"" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "UnknownClass = klass\n", "klass.name" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"NamedClass\"" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "UnknownClass.name" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6-1-6 class定義式とClass.new" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "undefined local variable or method `external_scope' for ExpDefineClass:Class", "output_type": "error", "traceback": [ "\u001b[31mNameError\u001b[0m: undefined local variable or method `external_scope' for ExpDefineClass:Class", "\u001b[37m
:3:in `'\u001b[0m", "\u001b[37m
:2: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": [ "external_scope = 1\n", "\n", "class ExpDefineClass\n", " puts external_scope\n", "end" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] }, { "data": { "text/plain": [ "NewDefineClass" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "NewDefineClass = Class.new do\n", " puts external_scope\n", "end" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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 }