{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### 4-3-2 オブジェクトへの変更を禁止する" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "true" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "o = Object.new\n", "o.freeze\n", "o.frozen?" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "false" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "o2 = Object.new\n", "o2.frozen?" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "false" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "str = \"hoge\"\n", "str.frozen?" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "\"hoge2\"" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "str << \"2\"" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "ename": "RuntimeError", "evalue": "can't modify frozen String", "output_type": "error", "traceback": [ "\u001b[31mRuntimeError\u001b[0m: can't modify frozen String", "\u001b[37m(pry):12:in `
'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `evaluate_ruby'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:323:in `handle_line'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:243:in `block (2 levels) in eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `catch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `block in eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `catch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/backend.rb:65:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/backend.rb:12:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:87:in `execute_request'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:47:in `dispatch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:37:in `run'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/command.rb:70:in `run_kernel'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/command.rb:34:in `run'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/bin/iruby:5:in `'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/bin/iruby:23:in `load'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/bin/iruby:23:in `
'\u001b[0m" ] } ], "source": [ "str.freeze\n", "str << \"0\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`.frreeze`しても代入は出来てしまう" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "(pry):14: warning: already initialized constant DEFAULT_CONST\n", "(pry):13: warning: previous definition of DEFAULT_CONST was here\n" ] }, { "data": { "text/plain": [ "{:foo=>234}" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "DEFAULT_CONST = {foo: 123}.freeze\n", "DEFAULT_CONST = {foo: 234}" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "false" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "DEFAULT_CONST.frozen?" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "true" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "DEFAULT_CONST.freeze\n", "DEFAULT_CONST.frozen?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`Hash`の中身は変更できない" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "ename": "RuntimeError", "evalue": "can't modify frozen Hash", "output_type": "error", "traceback": [ "\u001b[31mRuntimeError\u001b[0m: can't modify frozen Hash", "\u001b[37m(pry):18:in `
'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `evaluate_ruby'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:323:in `handle_line'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:243:in `block (2 levels) in eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `catch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `block in eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `catch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/backend.rb:65:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/backend.rb:12:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:87:in `execute_request'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:47:in `dispatch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:37:in `run'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/command.rb:70:in `run_kernel'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/command.rb:34:in `run'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/bin/iruby:5:in `'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/bin/iruby:23:in `load'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/bin/iruby:23:in `
'\u001b[0m" ] } ], "source": [ "DEFAULT_CONST[:foo] = 2" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "(pry):21: warning: already initialized constant FROZEN_INT\n", "(pry):19: warning: previous definition of FROZEN_INT was here\n" ] }, { "data": { "text/plain": [ "6" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "FROZEN_INT = 3\n", "FROZEN_INT.freeze\n", "FROZEN_INT += 3" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SyntaxError: unexpected '=', expecting end-of-input\n", ":foo = 3\n", " ^\n" ] } ], "source": [ ":foo = 3\n", ":foo\n", ":foo.frozen?" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "ename": "TypeError", "evalue": "can't define singleton", "output_type": "error", "traceback": [ "\u001b[31mTypeError\u001b[0m: can't define singleton", "\u001b[37m(pry):22:in `extend_object'\u001b[0m", "\u001b[37m(pry):22:in `extend'\u001b[0m", "\u001b[37m(pry):22:in `
'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `evaluate_ruby'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:323:in `handle_line'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:243:in `block (2 levels) in eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `catch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `block in eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `catch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/backend.rb:65:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/backend.rb:12:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:87:in `execute_request'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:47:in `dispatch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:37:in `run'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/command.rb:70:in `run_kernel'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/command.rb:34:in `run'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/bin/iruby:5:in `'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/bin/iruby:23:in `load'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/bin/iruby:23:in `
'\u001b[0m" ] } ], "source": [ ":foo.extend Enumerable" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4-3-3 オブジェクトをコピーする" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "70282404920840" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "original = Object.new\n", "original.object_id" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "70282396473120\n" ] }, { "data": { "text/plain": [ "false" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "original.freeze\n", "copy_dup = original.dup\n", "p copy_dup.object_id\n", "copy_dup.frozen?" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "70282404790600\n" ] }, { "data": { "text/plain": [ "true" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "copy_clone = original.clone\n", "p copy_clone.object_id\n", "copy_clone.frozen?" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "70282408680320\n", "70282408680320\n", "70282408680320\n" ] }, { "data": { "text/plain": [ "70282408680320" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "value = 'foo'\n", "array = [value]\n", "array_dup = array.dup\n", "array_clone = array.clone\n", "p value.object_id\n", "p array_dup.first.object_id\n", "p array_clone.first.object_id" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[\"foo\"]\n", "[\"foo\"]\n" ] }, { "data": { "text/plain": [ "[\"foo\"]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p array\n", "p array_dup" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[\"bar\"]\n", "[\"foo\"]\n" ] }, { "data": { "text/plain": [ "[\"foo\"]" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "array_dup[0] = \"bar\"\n", "p array_dup\n", "p array" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[\"foo2\"]\n" ] }, { "data": { "text/plain": [ "[\"foo2\"]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "array_dup = array.dup\n", "array_dup\n", "array_dup[0] << '2'\n", "p array_dup\n", "array" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "安全にdeep copyするなら`Marshal.dump`, `Marshal.load`するのも一つの方法" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "70282409381020" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Marshal.dump(array)\n", "array_dump= Marshal.load(Marshal.dump(array))\n", "array_dump.first.object_id" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "70282408680320" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "array.first.object_id" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[\"foo20\"]\n" ] }, { "data": { "text/plain": [ "[\"foo2\"]" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "array_dump[0] << '0'\n", "p array_dump\n", "array" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4-3-4 汚染されたオブジェクト\n", "\n", "pryとirubyの挙動が違う..." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "$SAFE" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "false" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Object.new.tainted?" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "true" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ENV['HOME'].tainted?" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "false\n", "true\n" ] }, { "data": { "text/plain": [ "true" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "o = Object.new\n", "p o.tainted?\n", "o.taint\n", "p o.tainted?" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "true" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rcfile = ENV['HOME'] + '/.zshrc'\n", "rcfile.tainted?" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "$SAFE = 1" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "$SAFE" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "\"/Users/mic/test_file\"" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test_file = ENV['HOME'] + '/test_file'" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "String" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ENV['HOME'].class" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "true" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ENV['HOME'].tainted?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 5章 主な組込みクラス/モジュール\n", "## 5-1 Numeric" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[Integer, Numeric, Comparable, Object, PP::ObjectMixin, Kernel, BasicObject]\n", "[Float, Numeric, Comparable, Object, PP::ObjectMixin, Kernel, BasicObject]\n", "[Rational, Numeric, Comparable, Object, PP::ObjectMixin, Kernel, BasicObject]\n", "[Complex, Numeric, Comparable, Object, PP::ObjectMixin, Kernel, BasicObject]\n", "[Fixnum, Integer, Numeric, Comparable, Object, PP::ObjectMixin, Kernel, BasicObject]\n" ] }, { "data": { "text/plain": [ "[Bignum, Integer, Numeric, Comparable, Object, PP::ObjectMixin, Kernel, BasicObject]" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p Integer.ancestors\n", "p Float.ancestors\n", "p Rational.ancestors\n", "p Complex.ancestors\n", "p Fixnum.ancestors\n", "Bignum.ancestors" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "true\n", "false\n" ] }, { "data": { "text/plain": [ "false" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p 0.zero?\n", "p 3.zero?" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0]\n", "[1, 3]\n" ] }, { "data": { "text/plain": [ "[1, 3]" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ary = [1, 0, 3]\n", "p ary.select(&:zero?)\n", "p ary.reject(&:zero?)\n", "ary.select(&:nonzero?)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "true\n", "false\n" ] }, { "ename": "NoMethodError", "evalue": "undefined method `numeric?' for 36.5:Float", "output_type": "error", "traceback": [ "\u001b[31mNoMethodError\u001b[0m: undefined method `numeric?' for 36.5:Float", "\u001b[37m(pry):100:in `
'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `evaluate_ruby'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:323:in `handle_line'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:243:in `block (2 levels) in eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `catch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `block in eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `catch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/backend.rb:65:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/backend.rb:12:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:87:in `execute_request'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:47:in `dispatch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:37:in `run'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/command.rb:70:in `run_kernel'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/command.rb:34:in `run'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/bin/iruby:5:in `'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/bin/iruby:23:in `load'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/bin/iruby:23:in `
'\u001b[0m" ] } ], "source": [ "p 365.integer?\n", "p 36.5.integer?\n", "p 36.5.numeric?" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "true\n" ] }, { "ename": "NoMethodError", "evalue": "undefined method `bignum?' for 100:Fixnum", "output_type": "error", "traceback": [ "\u001b[31mNoMethodError\u001b[0m: undefined method `bignum?' for 100:Fixnum", "\u001b[37m(pry):105:in `
'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `evaluate_ruby'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:323:in `handle_line'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:243:in `block (2 levels) in eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `catch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `block in eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `catch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/backend.rb:65:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/backend.rb:12:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:87:in `execute_request'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:47:in `dispatch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:37:in `run'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/command.rb:70:in `run_kernel'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/command.rb:34:in `run'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/bin/iruby:5:in `'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/bin/iruby:23:in `load'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/bin/iruby:23:in `
'\u001b[0m" ] } ], "source": [ "p 36.5.real?\n", "p 100.bignum?" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "false\n" ] }, { "data": { "text/plain": [ "false" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p Complex(1, 2).real?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5-1-1 算術演算" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3\n", "3.3333333333333335\n", "3\n" ] }, { "data": { "text/plain": [ "3.3333333333333335" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p 10 /3\n", "p 10.0 /3\n", "num = 10\n", "p num / 3\n", "num.to_f / 3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5-1-2 比較演算" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "true" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "123 == 123.0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5-1-3 丸め操作" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "2\n", "-2\n" ] }, { "data": { "text/plain": [ "-2" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p 1.4.round\n", "p 1.5.round\n", "p -1.5.round" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n", "2\n", "-1\n", "-1\n" ] }, { "data": { "text/plain": [ "-1" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p 1.4.ceil\n", "p 1.5.ceil\n", "p -1.5.ceil\n", "p -1.4.ceil" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "1\n", "-2\n" ] }, { "data": { "text/plain": [ "-2" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p 1.5.floor\n", "p 1.4.floor\n", "p -1.4.floor" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "-1\n", "1\n", "1\n", "1\n", "0\n", "-1\n" ] }, { "data": { "text/plain": [ "-1" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p 1.5.truncate\n", "p -1.5.truncate\n", "p 1.6.truncate\n", "p 1.7.truncate\n", "p 1.9.truncate\n", "p -0.9.truncate\n", "p -1.9.truncate" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5-1-4 繰り返し処理" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3\n", "4\n", "5\n" ] }, { "data": { "text/plain": [ "3" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "3.step 5 do |num|\n", " puts num\n", "end" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.2\n", "1.4\n", "1.6\n", "1.8\n", "2.0\n" ] }, { "data": { "text/plain": [ "1.2" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1.2.step 2.0, 0.2 do |num|\n", " puts num\n", "end" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3\n", "4\n", "5\n" ] }, { "data": { "text/plain": [ "3" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "3.upto(5) do |num|\n", " puts num\n", "end" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [ { "ename": "ArgumentError", "evalue": "wrong number of arguments (2 for 1)", "output_type": "error", "traceback": [ "\u001b[31mArgumentError\u001b[0m: wrong number of arguments (2 for 1)", "\u001b[37m(pry):153:in `upto'\u001b[0m", "\u001b[37m(pry):153:in `
'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `evaluate_ruby'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:323:in `handle_line'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:243:in `block (2 levels) in eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `catch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `block in eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `catch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/backend.rb:65:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/backend.rb:12:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:87:in `execute_request'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:47:in `dispatch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:37:in `run'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/command.rb:70:in `run_kernel'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/command.rb:34:in `run'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/bin/iruby:5:in `'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/bin/iruby:23:in `load'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/bin/iruby:23:in `
'\u001b[0m" ] } ], "source": [ "3.upto(10, 2) do |num|\n", " puts num\n", "end" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "outputs": [ { "ename": "NoMethodError", "evalue": "undefined method `upto' for 1.3:Float", "output_type": "error", "traceback": [ "\u001b[31mNoMethodError\u001b[0m: undefined method `upto' for 1.3:Float", "\u001b[37m(pry):156:in `
'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:355:in `evaluate_ruby'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:323:in `handle_line'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:243:in `block (2 levels) in eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `catch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:242:in `block in eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `catch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/pry-0.10.1/lib/pry/pry_instance.rb:241:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/backend.rb:65:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/backend.rb:12:in `eval'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:87:in `execute_request'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:47:in `dispatch'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/kernel.rb:37:in `run'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/command.rb:70:in `run_kernel'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/lib/iruby/command.rb:34:in `run'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/iruby-0.2.7/bin/iruby:5:in `'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/bin/iruby:23:in `load'\u001b[0m", "\u001b[37m/Users/mic/.rbenv/versions/2.2.2/bin/iruby:23:in `
'\u001b[0m" ] } ], "source": [ "1.3.upto(2.0) do |num|\n", " puts\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "次回は、`5-1-5 Integer`から" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Ruby 2.2.2", "language": "ruby", "name": "ruby" }, "language_info": { "file_extension": "rb", "mimetype": "application/x-ruby", "name": "ruby", "version": "2.2.2" } }, "nbformat": 4, "nbformat_minor": 0 }