问题描述
当我尝试用另一个 Iterable's
扩展 import sqlite3
conn = sqlite3.connect('emaildb.sqlite')
cur = conn.cursor()
cur.execute('DROP TABLE IF EXISTS Counts')
cur.execute('''
CREATE TABLE Counts (org TEXT,count INTEGER)''')
fh = open(r"c:\Users\hotsa\OneDrive\Desktop\code\SQ\mBox.txt")
for line in fh:
if not line.startswith('From: '): continue
pieces = line.split()
email = pieces[1]
dom = email.find('@')
org = email[dom + 1: len(email)]
cur.execute('SELECT count FROM Counts WHERE org = ? ',(org,))
row = cur.fetchone()
if row is None:
cur.execute('''INSERT INTO Counts (org,count)
VALUES (?,1)''',))
else:
cur.execute('UPDATE Counts SET count = count + 1 WHERE org = ?',))
conn.commit()
# https://www.sqlite.org/lang_select.html
sqlstr = 'SELECT org,count FROM Counts ORDER BY count DESC LIMIT 10'
for row in cur.execute(sqlstr):
print(str(row[0]),row[1])
cur.close()
时:
HashSet<String>
我明白了:
HashSet<String>
我该怎么做?
解决方法
HashSet::extend()
来自 Extend
trait,因此接受任何迭代器(或可迭代的),而不仅仅是一个集合。
如果您将引用传递给集合,则该引用是可迭代的,但迭代器会生成对集合元素的引用 - 在本例中为 &String
。由于 HashSet::<String>::extend()
需要一个生成实际字符串的迭代器,因此无法编译。有两种方法可以解决此问题:
- 通过将集合
b
传递给extend
按值:a.extend(b)
; - 通过使用
b
从b.iter()
创建显式迭代器并克隆它产生的值:a.extend(b.iter().cloned())
。
在第一个变体中,b
将被消耗,因此调用者不再可用,但它的字符串将在 a
中重用。在第二种变体中,b
将保持可用,但其字符串将被复制以存储在 a
中。
请注意,在任何一种变体中,捕获 extend()
的返回值都没有意义,因为它会产生副作用并且不会返回有用的值。