Movatterモバイル変換


[0]ホーム

URL:


Skip to content
Search Gists
Sign in Sign up

Instantly share code, notes, and snippets.

@udzura
Last activeMay 8, 2021 14:23
    • Star(76)You must be signed in to star a gist
    • Fork(2)You must be signed in to fork a gist

    Select an option

    Save udzura/7548163 to your computer and use it in GitHub Desktop.
    やわらかRuby
    やわらかRubyはCC BY 4.0 で提供します。
    詳細: https://creativecommons.org/licenses/by/4.0/deed.ja
    This work is licensed under a Creative Commons Attribution 4.0 International License.
    See also: https://creativecommons.org/licenses/by/4.0/deed

    chapter 0: Ruby をインストールする

    • rbenv
    • ruby-build

    問0-1

    • 以下のコマンドの出力結果を確認してみよう
    # (1)rbenv init -# (2)which ruby# (3)file`which ruby`# (3')file /usr/bin/ruby# (4)cat`which ruby`

    Rubyを遊び尽くす弾丸ツアー

    chapter 1: 整数、文字列、配列、ハッシュ

    • 頻出表現
    String#to_i#=Stringクラスのオブジェクトのメソッドto_i
    3.odd?#=> true4.odd?#=> false"paperboy".size#=> 8"paperboy".count("p")#=> 2"paperboy".reverse#=> "yobrepap"[1,4,5,3,2].sort#=> [1, 2, 3, 4, 5]

    問1-1

    • 次のメソッドは存在する?存在しない?

      1. Array#shuffle # ランダムに並び替える
      1. String#hexadecimal # 16進数として解釈する
      1. Integer#hours # 時間だとして何秒か表示する

    chapter 2: ビックリとハテナ

    • ハテナで終わるメソッドはtrueまたはfalseを返す。?で終わることが出来るので、わざわざis_~ を付けない。
    • ビックリで終わるメソッドは、元のオブジェクトに操作を加える(破壊的メソッド)
      • ただし、破壊的でないメソッドとかならず対になって存在する(Array#concatなどはビックリじゃないけど破壊的)
    str="quail"str.reverse#=> "liauq"str#=> "quail"str.reverse!#=> "liauq"str#=> "liauq"str.start_with?"q"#=> false

    問2-1

    • 以下のstr1とstr2の違いは何?
    str1=str2="paperboy"str1 +="&co."str2 <<"&co."# ヒントstr1 ==str2#=> ?str1.object_id ==str2.object_id#=> ?

    問2-2

    • こうするとstr1は変更されるが、
    str1="paperboy"str1.tr!"p","q"
    • こうするとstr2は変更されない。String#dupは何をしている?
    str2="paperboy"str2.dup.tr!"p","q"

    問2-3

    • 整数のクラス(Integer)に「!」で終わるメソッドはあるか?それはなぜか?

    chapter 3: ブロック

    • 3回繰り返す
    3.timesdoputs"Hello, world!"end
    • 配列に対して繰り返す
    ["dog","cat","chicken"].eachdo |name|putssprintf("%s is an animal",name)end
    • Fileを読み込んで必ず閉じる
    File.open("/etc/hosts")do |f|putsf.readend

    問3-1

    p=Proc.newdo |obj|pobjend
      1. p はどんなオブジェクト?irbで調べてみよう
      1. また、以下を実行するとどう表示される?
    ["dog","cat","chicken"].each &p["dog","cat","chicken"].eachpp.call"dog"

    chapter 4: クラスとモジュール

    classAnimaldefwarm_body?falseendendclassFish <AnimalendclassMammal <Animaldefwarm_body?trueendendFish.new.warm_body?Mammal.new.warm_body?
    • モジュールと三角継承
    classAnimalendclassMammal <Animaldefswimmable?falseendendmoduleSwimmabledefswimmable?trueendendclassFish <AnimalincludeSwimmableendclassDolphin <MammalincludeSwimmableendFish.new.swimmable?Mammal.new.swimmable?Dolphin.new.swimmable?
    • モジュールとは何だろう?

      • クラスのメソッド定義の一部を切り出したもの
      • 便利メソッドを束ねたもの
      • 名前空間
    • インスタンス変数

    classDogdefinitialize(name)@name=nameenddefinfo"This dog's name is#{@name}"endenddog=Dog.new("Akubi")putsdog.info# こうでもいいかもclassDogattr_accessor:namedefinitialize(name)self.name=nameenddefinfo"This dog's name is#{name}"endend
    • クラスメソッドの定義
    classDogclass <<selfdefprint_info(name)dog=new(name)putsdog.infoendendend

    問4-1

    • 以下のメソッドの結果はどういう意味か?
    Dolphin.ancestors

    問4-2

      1. Rubyの組み込みクラスの継承関係のドキュメントを探して、確認してみよう
      1. また、EnumerableComperable を継承しているクラスは何か確認してみよう

    chapter 5: オープンクラス

    deffizzbuzz(n)(1..n).eachdo |i|out=""if(i %3).zero?out="Fizz"endif(i %5).zero?out +="Buzz"endout=i.to_sifout.empty?putsoutendend
    • 100.to_fizzbuzz って呼び出したくない?
    classIntegerdefto_fizzbuzz(1..self).eachdo |i|out=""if(i %3).zero?out="Fizz"endif(i %5).zero?out +="Buzz"endout=i.to_sifout.empty?putsoutendendend200.to_fizzbuzz

    問5-1

    • Integer#hours を自作しよう

    問5-2

    • エスケープシーケンスについて調べて、String#to_red を追加しよう

    chapter 6: ほんのちょっとだけメタプログラミング

    bloc=procdoputsreverseputssizeputschars.shuffle.joinendbloc.call#=> NoMethodError!str="paperboy"str.instance_eval &bloc#=> !!!

    問6-1

      1. 実行して、その出力結果を記述しよう
      1. どういうことか考えるだけ考えてみよう

    問6-2

    • 以下と比較しよう。Object#indtance_evalKernel#eval はどう違う?
    methods="chars.shuffle.join"str="paperboy"eval"puts str.#{methods}"

    ちょっとだけ実用Ruby

    chapter 7: RubyGems

    • Rubyのパッケージマネージャー
    • Rubyの便利プログラムのひとまとまり=gem
    $ gem list -rd hashie*** REMOTE GEMS***hashie (2.0.5)    Authors: Michael Bleigh, Jerry Cheung    Homepage: https://github.com/intridea/hashie    Your friendly neighborhoodhash toolkit.
    • インストール
    $ gem install hashie
    • 使うには
    require"hashie"options=Hashie::Mash.new(name:"Akubi")options.name
    • gem以外にも、「標準添付ライブラリ」というものもあるよ
    require"uri"URI.parse"https://lolipop.jp"
    • gemの正体
      • 実は、特定の構成のファイル群をgzipで固めただけのもの
      • 一部はビルドスクリプトも付いている
      • インストール時に展開して特定のディレクトリに配置する

    問7-1

    • インストールしたgemについて、以下の表示を確認しよう
    $ gem list -d hashie

    問7-2

    • RubyGems.org で適当なgemをダウンロードして、展開して中身を見てみよう

    chapter 8: Bundler

    • 「プロジェクトでどんなgemを使うか」を管理するためのライブラリ
    • もともとRailsのgem管理システムが進化したもの
    source"https://rubygems.org"gem"hashie"gem"coderay"gem"redcarpet"
    ## brew install libxml2 libxslt$ cat Gemfile$ bundle install
    require"bundler/setup"Bundler.require# sample use coderayputsCodeRay.scan(<<EOC,:ruby).terminaldef add(some)  1 + 2 + someendEOC
    $ bundleexec ruby sample.rb

    問8-1

    • Gemfile.lock の中身を見てみよう

    問8-2

    • Gemfileのgem "redcarpet" をコメントアウトしたりしなかったりした状態で、以下のスクリプトの実行結果を見てみよう
      • ヒント: スクリプトは、Gemfileと同じディレクトリに配置しないとうまく行かないかも
    require"bundler/setup"require"redcarpet"pdefined?(Redcarpet)

    chapter 9: Sinatra で遊んでみよう

    $ gem install sinatra$ ruby -rsinatra -e"get('/') { 'Fastest web development' }"
    • 少しアプリらしくする
    Gemfileapp.rb
    source"https://rubygems.org"gem"sinatra"
    require"sinatra"get"/"do'Fastest web development'end
    $ bundleexec ruby app.rb

    DSLと言う考え方

    • get ~ do でルーティングと処理を表現する
    • get はRubyのメソッドではなく、Sinatraがウェブのルーティングを表現するために追加した専用の言語
    • use,set なども追加される

    問9-1

    • じゃんけんをするウェブアプリケーションを作ってみよう
    require"sinatra"get"/"doerb[(1)???]end[(2)???]"/result"do@choice=[(3)???]@op_choice=%w(goochokipaa).samplewin_to_lose={"goo"=>"choki","choki"=>"paa","paa"=>"goo",}@result=ifwin_to_lose[@choice] ==@op_choice"Won!"elsif@choice ==@op_choice"Draw"else"Lost..."enderb:resultend__END__@index<html><h1>じゃんけん?</h1><form action='/result' method='post'>  <select name='choice'>    <option value='goo'>グー</option>    <option value='choki'>チョキ</option>    <option value='paa'>パー</option>  </select><input type='submit'/></form></html>@ result<html><h1>結果:</h1><p><%=[(4)???]%></p><p>自分:<%=[(5)???]%> 相手:<%= [(6)???] %></p></html>

    問9-2

    • さっきのアプリケーションに、RubyのみでBasic認証の機能を追加するにはどうする?
      • ヒント: Rack Middleware

    最後に: Ruby情報(日本語)

    るりま

    るびま

    ドットインストール

    Ruby Toolbox

    @skuroki
    Copy link

    gem install hahsie

    @udzura
    Copy link
    Author

    はい

    Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment

    [8]ページ先頭

    ©2009-2025 Movatter.jp