- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
module SmsRu
# Setup configuration
mattr_accessor :api_id
mattr_reader :queries
@@queries = SmsRu::Config
def self.setup
yield self
end
# Sms.ru api settings
# all possible queries is exactly 2 level deep
@@stack_method ||= nil
# we need to undefine method send because of we use it in the api
class <<self
undef_method :send
end
def self.method_missing(m, options = {})
if @@stack_method
query_options = queries.configuration.to_h[@@stack_method].to_h[m].to_h
query_options.deep_merge!(api_id: api_id)
query_options.deep_merge! options
uri = URI.parse("http://sms.ru/#{@@stack_method.to_s}/#{m.to_s}")
@@stack_method = nil
response = Net::HTTP.post_form(uri, query_options)
raise SmsRu::ConnectionError, 'you have troubles with internet connection or API query is missing' unless response.kind_of? Net::HTTPSuccess
raise SmsRu::APIError, "something going wrong: query_options => #{query_options}, uri => #{uri}, response => #{response.body}" unless response.body.match(/^100/)
response.body.split("\n")
else
@@stack_method = m
return self
end
end
end
В руби в принципе нет строк, одни указатели.
В паскале - хз, в делфи - ссылочный, с подсчётом ссылок. Строки не мутабельны.
А в руби строки - указатели, аналог PChar.
В паскале длину строки хранит первый символ. Туда можно запихнуть вот такое чудо: str:='ололололо'#0'трололололо'; и при вызове Length длина будет корректной. Если же кастовать в PChar, то строка будет обрезана.
PChar — это тупо указатель на сишную нуль-терминированную строку (т. е. в ней нельзя хранить #0, а длина вычисляется медленно).
Истинно паскалевский тип string, переименованный в ShortString — это строка с присобаченным «нулевым» символом, хранящим длину (в такой строке можно хранить #0, а длина определяется мгновенно).
А есть ещё типы, появившиеся позже (всякие AnsiString, WideString, UnicodeString). Там переменная хранит указатель на строку, а перед строкой по отрицательному смещению хранится целая структура, содержащая длину строки, счётчик ссылок и прочие служебные данные. Т. е. хотя это и указатель, но распоряжаться им, как с сишными строками, указывая на середину строки, нельзя. Да, и #0 хранить можно, и длина определяется мгновенно, но память выделяется по-другому.
Лучшие ЯПы о них споткнулись: паскаль, С++, Python2/3...
Их нет.
То, что в C++ называется std::string — это на самом деле просто специализированная версия std::vector. В C++11 немного получше с UTF-8 стало, но итерацию по мультибайтным символам вперёд/назад вроде так и не завезли.
В С++ много разных, несовместимых между собою строк.
Выбирай любую! Пусть расцветают сто цветов!
Для передачи в TP используется стек или (начиная со вторых Дельфей) регистры. Как думаешь, много в регистр влезет?
Тем не менее, в Турбо Паскале есть три способа передачи:
1. По ссылке (ключевое слово var). Изменённое в процедуре/функции значение сразу же отображается во внешнем мире.
2. Как константу (ключевое слово const). Фактически это передача по ссылке, но компилятор запрещает внутри подпрограммы изменять значение.
3. По значению. Для того, что не может вместить регистр (для массивов и строк, например), эмулируется: вызывающий код выделяет место для копии, копирует и передаёт в подпрограмму ссылку на копию. Таким образом, изменять значение внутри подпрограммы можно, но оно не затронет внешний мир, потому что оно на копии. Для атомарных же типов (инты всякие) копия не создаётся, они просто кладутся в стек/регистр.
у того жопа в покликах