我正在尝试匹配泛型类型的特征范围:
macro_rules! test {
(
where $(
$bounded_type:ident: $( $bound:tt )++,
)+
) => {
// Dummy expansion for test:
struct Foo<T, U>
where $(
$bounded_type : $( $bound )++,
)+
{
t: T,
u: U
}
}
}
test! {
where
T: PartialEq + Clone,
U: PartialEq,
}
fn main() {}
不幸的是,如果我理解得很好,匹配特征的唯一方法是tt
片段,但是该片段几乎可以匹配任何东西,所以无论我做什么,都会遇到错误:
error: local ambiguity: multiple parsing options: built-in NTs tt ('bound') or 1 other option.
如何匹配这段代码?
请注意,我不需要 非常优雅的东西(对于普通用户不需要),但当然,它越优雅越好。
答案 0 :(得分:1)
我能够通过将第一个界限与其他界限分开来使其匹配。
I am a getting following ouput
(17, 7)
[[2 0 0 'Offline' 'Low' 'Cold' 'No']
[0 0 0 'Offline' 'High' 'Cold' 'No']
[3 0 1 'Online' 'High' 'Cold' 'Yes']
[2 0 1 'Offline' 'Low' 'Hot' 'Yes']
[2 0 1 'Offline' 'High' 'Hot' 'Yes']
[2 0 0 'Online' 'High' 'Cold' 'Yes']
[2 1 1 'Offline' 'Low' 'Hot' 'No']
[2 1 0 'Offline' 'Low' 'Cold' 'No']
[0 1 0 'Online' 'Low' 'Cold' 'Yes']
[3 1 1 'Online' 'Low' 'Hot' 'Yes']
[1 1 0 'Offline' 'Low' 'Hot' 'No']
[2 1 1 'Offline' 'Low' 'Hot' 'Yes']
[3 1 1 'Online' 'High' 'Hot' 'Yes']
[2 1 0 'Online' 'High' 'Hot' 'No']
[2 2 2 'Offline' 'Low' 'Hot' 'Yes']
[2 2 1 'Offline' 'Low' 'Cold' 'No']
[1 2 0 'Offline' 'High' 'Cold' 'Yes']]
(17, 7)
['Low' 'Low' 'High' 'High' 'High' 'Low' 'Low' 'Low' 'Low' 'High' 'Low'
'High' 'High' 'High' 'High' 'Low' 'Low']
(17, 7)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-42-84bec98371d4> in <module>()
28 print(X.shape)
29 onehotencoder = OneHotEncoder(categorical_features = [0])
---> 30 X = onehotencoder.fit_transform(X).toarray()
31 print(X.shape)
32 print(X)
C:\Users\patilsi\AppData\Local\Enthought\Canopy\edm\envs\User\lib\site-packages\sklearn\preprocessing\data.py in fit_transform(self, X, y)
2017 """
2018 return _transform_selected(X, self._fit_transform,
-> 2019 self.categorical_features, copy=True)
2020
2021 def _transform(self, X):
C:\Users\patilsi\AppData\Local\Enthought\Canopy\edm\envs\User\lib\site-packages\sklearn\preprocessing\data.py in _transform_selected(X, transform, selected, copy)
1807 X : array or sparse matrix, shape=(n_samples, n_features_new)
1808 """
-> 1809 X = check_array(X, accept_sparse='csc', copy=copy, dtype=FLOAT_DTYPES)
1810
1811 if isinstance(selected, six.string_types) and selected == "all":
C:\Users\patilsi\AppData\Local\Enthought\Canopy\edm\envs\User\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
431 force_all_finite)
432 else:
--> 433 array = np.array(array, dtype=dtype, order=order, copy=copy)
434
435 if ensure_2d:
(17, 7)
[[2 0 0 'Offline' 'Low' 'Cold' 'No']
[0 0 0 'Offline' 'High' 'Cold' 'No']
[3 0 1 'Online' 'High' 'Cold' 'Yes']
[2 0 1 'Offline' 'Low' 'Hot' 'Yes']
[2 0 1 'Offline' 'High' 'Hot' 'Yes']
[2 0 0 'Online' 'High' 'Cold' 'Yes']
[2 1 1 'Offline' 'Low' 'Hot' 'No']
[2 1 0 'Offline' 'Low' 'Cold' 'No']
[0 1 0 'Online' 'Low' 'Cold' 'Yes']
[3 1 1 'Online' 'Low' 'Hot' 'Yes']
[1 1 0 'Offline' 'Low' 'Hot' 'No']
[2 1 1 'Offline' 'Low' 'Hot' 'Yes']
[3 1 1 'Online' 'High' 'Hot' 'Yes']
[2 1 0 'Online' 'High' 'Hot' 'No']
[2 2 2 'Offline' 'Low' 'Hot' 'Yes']
[2 2 1 'Offline' 'Low' 'Cold' 'No']
[1 2 0 'Offline' 'High' 'Cold' 'Yes']]
(17, 7)
['Low' 'Low' 'High' 'High' 'High' 'Low' 'Low' 'Low' 'Low' 'High' 'Low'
'High' 'High' 'High' 'High' 'Low' 'Low']
(17, 7)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-42-84bec98371d4> in <module>()
28 print(X.shape)
29 onehotencoder = OneHotEncoder(categorical_features = [0])
---> 30 X = onehotencoder.fit_transform(X).toarray()
31 print(X.shape)
32 print(X)
C:\Users\patilsi\AppData\Local\Enthought\Canopy\edm\envs\User\lib\site-packages\sklearn\preprocessing\data.py in fit_transform(self, X, y)
2017 """
2018 return _transform_selected(X, self._fit_transform,
-> 2019 self.categorical_features, copy=True)
2020
2021 def _transform(self, X):
C:\Users\patilsi\AppData\Local\Enthought\Canopy\edm\envs\User\lib\site-packages\sklearn\preprocessing\data.py in _transform_selected(X, transform, selected, copy)
1807 X : array or sparse matrix, shape=(n_samples, n_features_new)
1808 """
-> 1809 X = check_array(X, accept_sparse='csc', copy=copy, dtype=FLOAT_DTYPES)
1810
1811 if isinstance(selected, six.string_types) and selected == "all":
C:\Users\patilsi\AppData\Local\Enthought\Canopy\edm\envs\User\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
431 force_all_finite)
432 else:
--> 433 array = np.array(array, dtype=dtype, order=order, copy=copy)
434
435 if ensure_2d:
ValueError: could not convert string to float: 'Yes'
但是,如果特征具有参数,这将不起作用。
答案 1 :(得分:1)
您最好的选择是阅读source code for the parse-generics-shim
crate;它有点旧了,但还是应该可以使用。 方法太复杂了,无法在Stack Overflow问题中进行解释,因为它基本上涉及将板条箱的源复制并粘贴到答案中。
更简单的方法是仅不解析实际的Rust语法,并使用宏解析器 可以处理的内容,例如将约束包装在一组中(例如{{1 }}。
答案 2 :(得分:0)
自2016年左右this issue结束以来,您可以使用path
宏类型来匹配TypePath
。
例如,根据我自己的代码:
($name:ident<$($l:lifetime, )*$($x:ident : $xt:path),+>($s:ident$(, $a:ident: $t:ty)*) -> $ret:ty => $body:block) => {
}