Что делает (унарный) *, оператор делает в этом коде Ruby?


Решение Swift 3.1


let ACCEPTABLE_CHARACTERS = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_."
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        let cs = CharacterSet(charactersIn: ACCEPTABLE_CHARACTERS).inverted
        let filtered: String = (string.components(separatedBy: cs) as NSArray).componentsJoined(by: "")
        return (string == filtered)
    }
169
задан undur_gongor 22 May 2012 в 06:55
поделиться

3 ответа

* - это оператор splat .

Он разворачивает массив в список аргументов, в этом case список аргументов метода Hash. [] . (Чтобы быть более точным, он расширяет любой объект, который отвечает на to_ary / to_a или to_a в Ruby 1.9.)

Для иллюстрации, следующее два оператора равны:

method arg1, arg2, arg3
method *[arg1, arg2, arg3]

Его также можно использовать в другом контексте, чтобы уловить все оставшиеся аргументы метода в определении метода. В этом случае он не расширяется, а объединяется:

def method2(*args)  # args will hold Array of all arguments
end

Более подробная информация здесь .

262
ответ дан 23 November 2019 в 20:51
поделиться

Как все упоминают, это "сплат". Искать синтаксис Ruby невозможно, и я задавал это в других вопросах. Ответ на эту часть вопроса заключается в том, что вы выполняете поиск по

asterisk in ruby syntax

в Google. Google готов помочь вам, просто выразите словами то, что вы видите.

В любом случае, как и многие другие Ruby-коды, этот код довольно плотный.

line.split(/=|;/)

составляет массив из ШЕСТИ элементов, first_name, mickey, last_name, mouse, country, usa . Затем знак splat используется для преобразования этого в хэш. Теперь люди, работающие с Ruby, всегда посылают вас взглянуть на метод Splat, поскольку все раскрыто в Ruby. Я понятия не имею, где он, но как только вы его получите, вы увидите, что он запускает для через массив и строит хэш.

Вы можете найти код в документации ядра . Если вы не можете его найти (я не смог), вы могли бы попробовать написать какой-нибудь код вроде этого (который работает, но НЕ является Ruby-подобным кодом):

line = "first_name=mickey;last_name=mouse;country=usa"
presplat = line.split(/=|;/)
splat = Hash.new
for i in (0..presplat.length-1)
    splat[presplat[i]] = presplat[i+1] if i%2==0
end

puts splat["first_name"]

, и тогда команда Ruby сможет сказать вам, почему ваш код глупо, плохо или просто неправильно.

Если вы дочитали до этого места, прочтите документацию по Hash для инициализации.

Обычно хэш, который инициализируется несколькими аргументами, создает их как пары ключ-значение:

Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}

Таким образом, в вашем примере это приведет к следующему хэшу:

{"first_name"=>"mickey", "last_name"=>"mouse", "county"=>"usa"}
6
ответ дан 23 November 2019 в 20:51
поделиться

Оператор splat распаковывает массив, переданный функции, так что каждый элемент отправляется в функцию как отдельный параметр.

Простой пример:

>> def func(a, b, c)
>>   puts a, b, c
>> end
=> nil

>> func(1, 2, 3)  #we can call func with three parameters
1
2
3
=> nil

>> list = [1, 2, 3]
=> [1, 2, 3]

>> func(list) #We CAN'T call func with an array, even though it has three objects
ArgumentError: wrong number of arguments (1 for 3)
    from (irb):12:in 'func'
    from (irb):12

>> func(*list) #But we CAN call func with an unpacked array.
1
2
3
=> nil

Вот и все!

43
ответ дан 23 November 2019 в 20:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: