Каковы некоторые варианты использования в качестве примера для литералов символа в Scala?

Как насчет этого:

for t in d['c'].keys():
     d[t] = d['c'][t]

Вот пример:

>>> d = {'a': '', 'b': '', 'c':{'a':1, 'b':2}}
>>> d
{'a': '', 'b': '', 'c': {'a': 1, 'b': 2}}
>>> d.keys()
dict_keys(['a', 'b', 'c'])
>>> d['c'].keys()
dict_keys(['a', 'b'])
>>> for t in d['c'].keys():
...     d[t] = d['c'][t]
... 
>>> d
{'a': 1, 'b': 2, 'c': {'a': 1, 'b': 2}}
>>> 

Мы можем превратить его в функцию:

>>> def updateDict(dict, sourceKey):
...     for targetKey in dict[sourceKey].keys():
...             dict[targetKey] = dict[sourceKey][targetKey]
... 
>>> d = {'a': '', 'b': '', 'c':{'a':1, 'b':2}}
>>> def updateDict(dict, sourceKey):
...     for targetKey in dict[sourceKey].keys():
...             dict[targetKey] = dict[sourceKey][targetKey]
...     return dict
... 
>>> d
{'a': '', 'b': '', 'c': {'a': 1, 'b': 2}}
>>> updateDict(d, 'c')
{'a': 1, 'b': 2, 'c': {'a': 1, 'b': 2}}
>>> d = {'a': '', 'b': '', 'c':{'a':1, 'b':2, 'z':1000}}
>>> updateDict(d, 'c')
{'a': 1, 'b': 2, 'c': {'a': 1, 'b': 2, 'z': 1000}, 'z': 1000}
>>> 
90
задан Joe Holloway 23 April 2009 в 04:11
поделиться

2 ответа

В терминах Java символы являются интернированными строками. Это означает, например, что сравнение ссылочного равенства ( eq в Scala и == в Java) дает тот же результат, что и сравнение нормального равенства ( == в Scala и равны в Java): 'abcd eq' abcd вернет true, в то время как «abcd» eq «abcd» может и не быть, в зависимости от прихотей JVM ( ну, это должно быть для литералов, но не для строк, создаваемых динамически в общем).

Другими языками, которые используют символы, являются Lisp (который использует 'abcd как Scala), Ruby (: abcd ), Эрланг и Пролог ( abcd ; они называются атомами вместо символов).

Я бы использовал символ, когда я не не заботиться о структуре строки и использовать ее как имя для чего-то. Например, если у меня есть таблица базы данных, представляющая компакт-диски, которая включает в себя столбец с именем «цена», мне все равно, что второй символ в «цене» - это «r», или о конкатенации имен столбцов; поэтому библиотека базы данных в Scala может разумно использовать символы для имен таблиц и столбцов.

75
ответ дан 24 November 2019 в 07:07
поделиться

If you have plain strings representing say method names in code, that perhaps get passed around, you're not quite conveying things appropriately. This is sort of the Data/Code boundary issue, it's not always easy to the draw the line, but if we were to say that in that example those method names are more code than they are data, then we want something to clearly identify that.

A Symbol Literal comes into play where it clearly differentiates just any old string data with a construct being used in the code. It's just really there where you want to indicate, this isn't just some string data, but in fact in some way part of the code. The idea being things like your IDE would highlight it differently, and given the tooling, you could refactor on those, rather than doing text search/replace.

This link discusses it fairly well.

25
ответ дан 24 November 2019 в 07:07
поделиться
Другие вопросы по тегам:

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