- 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
Unnumbered 12.08.2016 10:29 # +5
dxd 12.08.2016 11:15 # +7
guesto 17.08.2016 14:20 # −111
void_main 17.08.2016 19:58 # +103
В руби в принципе нет строк, одни указатели.
guestinho 31.08.2016 22:24 # 0
3_14dar 31.08.2016 22:39 # 0
3_14dar 31.08.2016 22:40 # 0
CTEPTOP 31.08.2016 22:45 # −64
В паскале - хз, в делфи - ссылочный, с подсчётом ссылок. Строки не мутабельны.
А в руби строки - указатели, аналог PChar.
inkanus-gray 31.08.2016 22:58 # 0
CTEPTOP 31.08.2016 23:03 # −64
inkanus-gray 31.08.2016 23:09 # 0
CTEPTOP 31.08.2016 23:12 # −63
В паскале длину строки хранит первый символ. Туда можно запихнуть вот такое чудо: str:='ололололо'#0'трололололо'; и при вызове Length длина будет корректной. Если же кастовать в PChar, то строка будет обрезана.
inkanus-gray 31.08.2016 23:25 # 0
PChar — это тупо указатель на сишную нуль-терминированную строку (т. е. в ней нельзя хранить #0, а длина вычисляется медленно).
Истинно паскалевский тип string, переименованный в ShortString — это строка с присобаченным «нулевым» символом, хранящим длину (в такой строке можно хранить #0, а длина определяется мгновенно).
А есть ещё типы, появившиеся позже (всякие AnsiString, WideString, UnicodeString). Там переменная хранит указатель на строку, а перед строкой по отрицательному смещению хранится целая структура, содержащая длину строки, счётчик ссылок и прочие служебные данные. Т. е. хотя это и указатель, но распоряжаться им, как с сишными строками, указывая на середину строки, нельзя. Да, и #0 хранить можно, и длина определяется мгновенно, но память выделяется по-другому.
guesto 31.08.2016 23:29 # +6
Лучшие ЯПы о них споткнулись: паскаль, С++, Python2/3...
kurwa 31.08.2016 23:45 # 0
void_main 31.08.2016 23:48 # −74
roman-kashitsyn 04.10.2016 13:34 # +2
Их нет.
roman-kashitsyn 04.10.2016 14:17 # +4
То, что в C++ называется std::string — это на самом деле просто специализированная версия std::vector. В C++11 немного получше с UTF-8 стало, но итерацию по мультибайтным символам вперёд/назад вроде так и не завезли.
Soul_re@ver 04.10.2016 14:28 # 0
roman-kashitsyn 04.10.2016 14:40 # 0
barop 04.10.2016 21:05 # −1
В С++ много разных, несовместимых между собою строк.
Выбирай любую! Пусть расцветают сто цветов!
kurwa 04.10.2016 21:31 # 0
barop 04.10.2016 22:01 # 0
dxd 04.10.2016 20:05 # 0
guest 04.10.2016 20:51 # 0
Soul_re@ver 31.08.2016 23:14 # +1
void_main 31.08.2016 23:21 # −64
inkanus-gray 31.08.2016 22:55 # 0
Для передачи в TP используется стек или (начиная со вторых Дельфей) регистры. Как думаешь, много в регистр влезет?
Тем не менее, в Турбо Паскале есть три способа передачи:
1. По ссылке (ключевое слово var). Изменённое в процедуре/функции значение сразу же отображается во внешнем мире.
2. Как константу (ключевое слово const). Фактически это передача по ссылке, но компилятор запрещает внутри подпрограммы изменять значение.
3. По значению. Для того, что не может вместить регистр (для массивов и строк, например), эмулируется: вызывающий код выделяет место для копии, копирует и передаёт в подпрограмму ссылку на копию. Таким образом, изменять значение внутри подпрограммы можно, но оно не затронет внешний мир, потому что оно на копии. Для атомарных же типов (инты всякие) копия не создаётся, они просто кладутся в стек/регистр.
guesto 17.08.2016 10:43 # −117
guesto 20.08.2016 21:52 # −62
Shamill 21.08.2016 12:16 # −168
bagor 21.08.2016 12:26 # −230
guest 04.10.2016 02:39 # 0
у того жопа в покликах