case
в Ruby
require
В Ruby има "switch". Казва се case
.
def quote(name)
case name
when 'Yoda'
puts 'Do or do not. There is no try.'
when 'Darth Vader'
puts 'The Force is strong with this one.'
when 'R2-D2'
puts 'Beep. Beep. Beep.'
else
puts 'Dunno what to say'
end
end
break
.
when
не мине, изпълнява се else
.
when
не мине, и няма else
, не става нищо.
case
е израз, което значи, че връща стойност.case operation
when :& then puts 'And?'
when :| then puts 'Or...'
when :! then puts 'Not!'
end
На какво ще се оцени следният код?
case 'Wat?'
when 'watnot' then puts "I'm on a horse."
end
Ако няма else
и никой when
не match-не, се връща nil
.
case
не сравнява с ==
. Може да напишете следното.
def qualify(age)
case age
when 0..12
'still very young'
when 13..19
'a teenager! oh no!'
when 33
'the age of jesus'
when 90..200
'wow. that is old!'
else
'not very interesting'
end
end
case
сравнява с ===
. Няколко класа го имплементират:
Range
Regexp
Class
==
.def qualify(thing)
case thing
when Integer then 'this is a number'
when String then 'it is a string'
when Array then thing.map { |item| qualify item }
else 'huh?'
end
end
case hours_of_sleep
when 8..10 then 'I feel fine.'
when 6...8 then 'I am a little sleepy.'
when 1..3 then 'OUT OF MY WAY! I HAVE PLACES TO BE AND PEOPLE TO SEE!'
end
def parse_date(date_string)
case date_string
when /(\d{4})-(\d\d)-(\d\d)/
Date.new $1.to_i, $2.to_i, $3.to_i
when /(\d\d)\/(\d\d)/(\d{4})/
Date.new $3.to_i, $1.to_i, $2.to_i
end
end
when
case
, например:thing = 42
case
when thing == 1 then 1
else 'no_idea'
end
if
-овеСега е моментът.
foo = 'baba'
a, b = 1, 2
a # 1
b # 2
a, b = b, a
a # 2
b # 1
Има няколко различни случая, които ще разгледаме.
a = 1, 2, 3
a # [1, 2, 3]
Практически същото като a = [1, 2, 3]
a, b = [1, 2, 3]
a # 1
b # 2
a, b = 1, 2, 3
a # 1
b # 2
nil
head, *tail = [1, 2, 3]
head # 1
tail # [2, 3]
first, *middle, last = 1, 2, 3, 4
first # 1
middle # [2, 3]
last # 4
middle
и head
обират всичко останало
first, *middle, last = 1, [2, 3, 4]
first # 1
middle # []
last # [2, 3, 4]
first, *middle, last = 1, *[2, 3, 4]
first # 1
middle # [2, 3]
last # 4
head, (title, body) = [1, [2, 3]]
head # 1
title # 2
body # 3
head, (title, (body,)) = [1, [2, [3]]]
)
head, (title, *sentences) = 1, [2, 3, 4, 5, 6]
head # 1
title # 2
sentences # [3, 4, 5, 6]
Бележка за реда на оценка при присвояване — първо отдясно, след това отляво:
x = 0
a, b, c = x, (x += 1), (x += 1)
x # 2
a # 0
b # 1
c # 2
Може да ползвате едно име само един път, когато то се среща в списък с параметри на метод, блок и прочее.
Proc.new { |a, b, a| } # SyntaxError: duplicated argument name
Proc.new { |_, b, _| } # => #<Proc:0x007f818af68de0@(irb):23>
Горното важи не само за блокове, но и за методи.
success, message = execute(job)
[[1, [2, 3]], [4, [5, 6]], [7, [8, 9]]].each do |a, (b, c)|
puts "#{a}, #{b}, #{c}"
end
# 1, 2, 3
# 4, 5, 6
# 7, 8, 9
Имате ли въпроси по тази тема?
В Ruby, код от други файлове се импортира с require
.
Например:
require 'bigdecimal'
require 'bigdecimal/util'
require 'foo'
търси файл foo.rb
в "пътя за зареждане".
require 'foo/bar'
търси директория foo
с файл bar.rb
.
.rb
отзад не е задължително да присъства.
require './foo'
търси foo.rb
в текущата директория.
require '/home/skanev/foo.rb'
.require './foo'
require_relative
require_relative 'foo'
зарежда 'foo' спрямо директорията на изпълняващия се файл
require './foo'
зарежда спрямо текущата директория на изпълняващия процес$LOAD_PATH
.$:
$:.unshift(path)
require
-а. Почти.
main
обекта е същия.
require
-и не правят нищо.
require
може да зарежда .so
и .dll
файлове.. ├── README.rdoc ├── Rakefile ├── bin │ └── skeptic ├── features ├── lib │ ├── skeptic │ │ ├── rules.rb │ │ └── scope.rb │ └── skeptic.rb ├── skeptic.gemspec └── spec
lib/
обикновено съдържа foo.rb
и lib/foo/
.
foo.rb
обикновено е единственото нещо в lib/
.
lib/foo
.
lib/
се добавя в load path.
require 'foo'
или require 'foo/something'
.
require
областта.
require
и $LOAD_PATH
и вижте какво се случва.load
е много сходен с require
, но има няколко разлики.
load 'foo.rb'
.
load
-ове изпълняват файла.
load
не може да зарежда .so
/.dll
библиотеки.
load
има опционален параметър, с който може да обвие файла в анонимен модул.
Object#freeze
Object#frozen?
module Entities
ENTITIES = {
'&' => '&',
'"' => '"',
'<' => '<',
'>' => '>',
}.freeze
ENTITY_PATTERN = /#{ENTITIES.keys.join('|')}/.freeze
def escape(text)
text.gsub ENTITY_PATTERN, ENTITIES
end
end