ruby入門基礎知識
3821 ワード
定数:
rubyは定数の頭文字を大文字にする必要がありますが、可読性のためにすべての大文字を推奨します.そして、定数と言っても可変ですが、警告があります.
Range
たとえば、1..3 ,1...3、2つの点は最後の数値3を含み、3つの点は3を含まない.
メソッド名は
データパッケージ
すべての物件変数(
ここの
Rubyのprivateとprotectedの定義は、他のプログラム言語とは異なり、継承システム全体で呼び出すことができます.2つの違いはprivateが受信者(receiver)を指定しない場合にのみ呼び出すことができ、
物件案内の用語では、
ModuleはRubyの非常に使いやすい機能で、Classカテゴリとよく似ていて、方法を定義します.ただnewで構築することはできません.最初の目的は、Namespaceとしてツールを配置する方法です.
もう1つの重要な機能はMixinsであり、1つのModuleをカテゴリに組み込むことができ、このカテゴリがこのModuleの方法を持つことができます.今度は2つのファイルに分解しましょうrbとfoobar.rb、それからfoobar.rbでは
まずdebug.rb
そしてfoobarですrb
RubyはModuleを使用して多重継承の問題を解決し、異なるカテゴリ間で同じ方法を持っていれば、Moduleに変更することができ、
その他の反復の例
その他の一般的な慣例:
result ||= a
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_accessor
、attr_writer
、attr_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
result
がnil
であれば、a
がresult
に割り当てられる.以上のプログラムはresult = a if result.nil?