Object#eql?
, $!
и $@
, next
, break
, redo
, retry
dup
, clone
, initialize_copy
Ще продължим с още малко слайдове за Git.
git revert <commit>
commit
commit
, но наобратно
+
в diff-a, става на -
и обратно
git reflog
.gitignore
е шаблон за файлове/директории, които трябва да бъдат игнорирани
git status
/bar # Файла/директорията bin в главната директория на проекта bin # Всички файлове и директории с име bin bin/ # Всички директории с име bin compiled/*.html # Всички файлове с разширение html в директория compiled lib/**/*.txt # Всички текстови файлове в lib или нейна поддиректория *.exe # Всички изпълними файлове за Windows
git checkout killer-feature
git rebase master
git rebase -i
git rebase -i master
git rebase -i HEAD~4
git pull --rebase
master
git push --force
, ако вече сте push-нали branch-a, който променяте
git blame lectures/index.yml
git add
, git commit
git push
, git pull
git checkout
git merge
, git rebase -i
git reflog
Искайте помощ:
git help <command>
git <command> --help
man git
man git-<command>
#eql?
прави сравнение без type coercion.1 == 1.0 # => true
1.eql?(1.0) # => false
$!
е последното "възбудено" изключение$@
е stacktrace-а на последното изключениеВсъщност, #initialize
е просто instance метод.
Class#new
е имплементиран горе-долу така:
class Class
def new
object = self.allocate
object.send :initialize
object
end
end
#dup
и #clone
правят копие на обект
#initialize_copy
#clone
копира singleton методи и freeze-ва обекта, ако е замразенretry
изпълнява begin
блока отначало.
retries_left = 3
begin
connect_to_facebook
rescue ConnectionError
retries_left -= 1
retry if retries_left > 0
end
retry
може да се ползва в rescue
/ensure
клауза в метод
redo
– просто рестартира блока
next
– прекратява работата на блока
break
– прекратява работата на метода, извикващ блока
next
, redo
и break
могат да се използват само в блоковеnext
прекратява работата на блока:
def bar
p "bar started"
p yield
p yield
p "bar finished"
end
bar do
p "block started"
next "Return value"
p "block finished"
end
Резултатът ще е:
"bar started"
"block started"
"Return value"
"block started"
"Return value"
"bar finished"
=> "bar finished"
break
прекратява работата на блока и на метода, който го извиква:
def bar
p "bar started"
p yield
p yield
p "bar finished"
end
bar do
p "block started"
break "Return value"
p "block finished"
end
Резултатът ще е:
"bar started"
"block started"
=> "Return value"
Следват няколко думи за клас променливи.
class Person
@@count = 0
def initialize
@@count += 1
end
def self.how_many
@@count
end
end
Person.new
Person.new
Person.how_many # => 2
@@
NameError
(направете разлика с инстанционните променливи)
class B
@@foo = 1
def self.foo() @@foo end
def self.hmm() @@bar end
end
class D < B
@@bar = 2
def self.bar() @@bar end
def self.change() @@foo = 3; @@bar = 4; end
end
[B.foo, D.foo, D.bar] # => [1, 1, 2]
B.hmm # => error: NameError
D.change
[B.foo, D.foo, D.bar] # => [3, 3, 4]
B.hmm # => error: NameError
D.hmm # => error: NameError