ruby入門基礎知識

3821 ワード

定数:
rubyは定数の頭文字を大文字にする必要がありますが、可読性のためにすべての大文字を推奨します.そして、定数と言っても可変ですが、警告があります.
 
Range
たとえば、1..3 ,1...3、2つの点は最後の数値3を含み、3つの点は3を含まない.
  to_s(文字列に変換)、to_i(整数に変換)、またはto_f(浮動小数点数に変換)
 
メソッド名は?または!で終わることができ、前者はBoolean値が返信されることを示し、後者は何らかの副作用(side-effect)があることを示す.
 
データパッケージ
すべての物件変数(@先頭)、カテゴリ変数(@@先頭)は、カテゴリ内にカプセル化されており、カテゴリ外はアクセスできません.
class Person

    def initialize(name)

        @name = name

    end

end



p = Person.new('ihower')

p.name 

=> NoMethodError

p.name='peny' 

=> NoMethodError
@nameにアクセスできるように、メソッドを定義する必要があります.
class Person



   def initialize(name)

    @name = name

   end



   def name

     @name

   end



   def name=(name)

     @name = name

   end

end



p = Person.new('ihower')

p.name 

=> "ihower"

p.name="peny"

=> "peny"


上述定義物件變數的存取方法實在太常見了,因此Ruby提供了attr_accessorattr_writerattr_reader類別方法可以直接定義這些方法。上述的程式可以改寫成:

class Person

  attr_accessor :name

end



p = Person.new('ihower')

p.name 

=> "ihower"

p.name="peny"

=> "peny"    

ここのattr_accessorは実はカテゴリメソッドです.
 
Rubyのprivateとprotectedの定義は、他のプログラム言語とは異なり、継承システム全体で呼び出すことができます.2つの違いはprivateが受信者(receiver)を指定しない場合にのみ呼び出すことができ、self.private_method_1に電話することもできません.プリセットはselfがprivateメソッドの受信者であるに違いありません.一方、protectedメソッドは、1つのカテゴリまたはサブカテゴリのオブジェクトによって呼び出されるだけでなく、別の同じカテゴリのオブジェクトを受信者として使用することもできる.
物件案内の用語では、object.call_methodはobjectが実行call_を受信することを意味する.methodの命令、すなわちobjectはcall_methodメソッドの受信者(receiver).object.__send__(:call_method)に書き換えることもできます
ModuleはRubyの非常に使いやすい機能で、Classカテゴリとよく似ていて、方法を定義します.ただnewで構築することはできません.最初の目的は、Namespaceとしてツールを配置する方法です.
module MyUtil



    def self.foobar

        puts "foobar"

    end

end



MyUtil.foobar

#    foobar

もう1つの重要な機能はMixinsであり、1つのModuleをカテゴリに組み込むことができ、このカテゴリがこのModuleの方法を持つことができます.今度は2つのファイルに分解しましょうrbとfoobar.rb、それからfoobar.rbではrequireでdebugを参照する.rb:
まずdebug.rb
module Debug

    def who_am_i?

        puts "#{self.class.name}: #{self.inspect}"

    end

end

そしてfoobarですrb
require "./debug"

class Foo

    include Debug #        Mixin

end



class Bar

    include Debug

end



f = Foo.new

b = Bar.new

f.who_am_i? #    Foo: #<Foo:0x00000102829170>

b.who_am_i? #    Bar: #<Bar:0x00000102825b88>

RubyはModuleを使用して多重継承の問題を解決し、異なるカテゴリ間で同じ方法を持っていれば、Moduleに変更することができ、includeに変更することができます.
 
その他の反復の例
#           

a = [ "a", "b", "c", "d" ]

b = a.map {|x| x + "!" }

puts b.inspect



#     ["a!", "b!", "c!", "d!"]



#         

b = [1,2,3].find_all{ |x| x % 2 == 0 }

b.inspect

#     [2]



#          

a = [51, 101, 256]

a.delete_if {|x| x >= 100 }

#     [51]



#      

[2,1,3].sort! { |a, b| b <=> a }

#     [3, 2, 1]



#     

(5..10).inject {|sum, n| sum + n }



#       find the longest word

longest = ["cat", "sheep", "bear"].inject do |memo,word|

    ( memo.length > word.length )? memo : word

end
<=>は比較演算子であり、2つの数字が再送0に等しい場合、第1の数字が大きい場合、1に返信し、逆に-1に返信する.
 
その他の一般的な慣例:
 result ||= a resultnilであれば、aresultに割り当てられる.以上のプログラムは
result = a if result.nil?