我想知道是否可以让编译器为代码发出警告/错误,如下所示:
注意:
1.是的,这是糟糕的编程风格,我们应该避免这种情况 - 但我们正在处理遗留代码,并希望编译器可以帮助我们识别这些情况.)
2.我更喜欢编译器选项(VC++)来禁用或启用对象切片(如果有的话).
class Base{};
class Derived: public Base{};
void Func(Base)
{
}
//void Func(Derived)
//{
//
//}
//main
Func(Derived());
Run Code Online (Sandbox Code Playgroud)
在这里,如果我注释掉第二个函数,第一个函数将被调用 - 而编译器(VC++和Gcc)对此感觉很舒服.
它是C++标准吗?并且我可以问编译器(VC++)在遇到这样的代码时给我一个警告吗?
非常感谢!!!
编辑:
非常感谢你的帮助!
我找不到一个编译器选项来给出错误/警告 - 我甚至在MSDN论坛上发布了这个VC++编译器顾问没有回答.所以我担心gcc和vc ++都没有实现这个功能.
因此,添加构造函数将派生类作为参数将是目前最好的解决方案.
编辑
我已经向MS提交了一个feedbak,希望他们能尽快修复它:
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=421579
-Baiyan
使用数组,let foo = [|1;2;3;4|]我可以使用以下任何一种方法从数组中返回一个切片.
foo.[..2]
foo.[1..2]
foo.[2..]
Run Code Online (Sandbox Code Playgroud)
我如何为List做同样的事情let foo2 = [1;2;3;4]?当我尝试与我得到的数组相同的语法时error FS00039: The field, constructor or member 'GetSlice' is not defined.
获取List子节的首选方法是什么?为什么它们不是为了支持GetSlice而构建的?
我试图想出一种初始化哈希的方法,而不必经历一个循环.我希望使用切片,但它似乎没有产生预期的结果.
请考虑以下代码:
#!/usr/bin/perl
use Data::Dumper;
my %hash = ();
$hash{currency_symbol} = 'BRL';
$hash{currency_name} = 'Real';
print Dumper(%hash);
Run Code Online (Sandbox Code Playgroud)
这确实按预期工作并产生以下输出:
$VAR1 = 'currency_symbol';
$VAR2 = 'BRL';
$VAR3 = 'currency_name';
$VAR4 = 'Real';
Run Code Online (Sandbox Code Playgroud)
当我尝试按如下方式使用切片时,它不起作用:
#!/usr/bin/perl
use Data::Dumper;
my %hash = ();
my @fields = ('currency_symbol', 'currency_name');
my @array = ('BRL','Real');
@hash{@array} = @fields x @array;
Run Code Online (Sandbox Code Playgroud)
输出是:
$VAR1 = 'currency_symbol';
$VAR2 = '22';
$VAR3 = 'currency_name';
$VAR4 = undef;
Run Code Online (Sandbox Code Playgroud)
显然有些不对劲.
所以我的问题是:给定两个数组(键和值)初始化哈希的最优雅方法是什么?
我可以问一下string对象slice()和substr()JavaScript 之间的区别是什么?
我熟悉切片,我只是无法绕过这个,我尝试改变一些值来试图说明发生了什么,但这对我没有意义.
无论如何,这是一个例子:
l = [[0, 0, 0], [0, 1, 0], [1, 0, 0], [1, 1, 1]]
print l[:,0:2]
Run Code Online (Sandbox Code Playgroud)
导致:
[[0, 0], [0, 1] [1, 0], [1, 1]]
Run Code Online (Sandbox Code Playgroud)
我试图将其翻译为"从索引0切换到0,2,递增2"这对我来说毫无意义.
我无法按字符排序字符串(检查两个字符串是否为字谜,我想对它们进行排序,并检查是否相等).
我可以得到这样[]rune的字符串表示s:
runes := make([]rune, len(s))
copy(runes, []rune(s))
Run Code Online (Sandbox Code Playgroud)
我可以像这样排序
someInts := []int{5, 2, 6, 3, 1, 4} // unsorted
sort.Ints(someInts)
Run Code Online (Sandbox Code Playgroud)
但这rune只是一个别名,int32所以我应该可以打电话
sort.Ints(runes)
Run Code Online (Sandbox Code Playgroud)
但是,我收到错误:
cannot use runes (type []rune) as type []int in function argument
Run Code Online (Sandbox Code Playgroud)
那么......我如何对int32,int64或int*进行排序?
编辑:我确实得到了我的符文排序,但男孩,这是丑陋的.
type RuneSlice []rune
func (p RuneSlice) Len() int { return len(p) }
func (p RuneSlice) Less(i, j int) bool { return p[i] < p[j] }
func (p RuneSlice) Swap(i, j int) { p[i], p[j] = …Run Code Online (Sandbox Code Playgroud) 我一直在读Go,并且难以想到这个基本问题.
在Go中,很明显切片更灵活,当您需要一系列数据时,通常可以使用切片代替数组.
阅读大部分文档,他们似乎鼓励开发人员只使用切片而不是数组.我得到的印象就像创作者可以简单地设计数组来调整大小,并且没有整个切片部分.事实上,这样的设计会使语言更容易理解,甚至可能鼓励更多惯用的代码.
那么为什么创作者首先允许阵列呢?何时使用数组而不是切片?是否有过的情况下在片数组的使用将是引人注目的?
当我查阅官方文档(http://golang.org/doc/effective_go.html#arrays)时,我发现的唯一有用的部分是:
在规划内存的详细布局时,数组很有用,有时可以帮助避免分配,但主要是它们是切片的构建块.
他们接着讨论了数组如何作为值的昂贵,以及如何用指针模拟C风格的行为.即便如此,他们还是明确地推荐了阵列部分:
但即便是这种风格也不是惯用的Go.改为使用切片.
那么,什么是"规划内存的详细布局"或"帮助避免分配"这些切片不适合的一些真实示例?
我有一个字节数组,固定长度为4.
token := make([]byte, 4)
Run Code Online (Sandbox Code Playgroud)
我需要将每个字节设置为一个随机字节.我怎么能这样做,在最有效的事情?math/rand就我而言,这些方法不提供随机字节功能.
也许有内置的方式,或者我应该生成随机字符串并将其转换为字节数组?
我试图使用Array.prototype切片对象,但是它返回一个空数组,除了传递参数之外是否有任何方法来切片对象,或者只是我的代码有错误?谢谢!!
var my_object = {
0: 'zero',
1: 'one',
2: 'two',
3: 'three',
4: 'four'
};
var sliced = Array.prototype.slice.call(my_object, 4);
console.log(sliced);
Run Code Online (Sandbox Code Playgroud) 什么是通过更多索引范围(例如by 10:12和25:28)对数据帧进行切片的pythonic方法?我希望以更优雅的方式:
df = pd.DataFrame({'a':range(10,100)})
df.iloc[[i for i in range(10,12)] + [i for i in range(25,28)]]
Run Code Online (Sandbox Code Playgroud)
结果:
a
10 20
11 21
25 35
26 36
27 37
Run Code Online (Sandbox Code Playgroud)
像这样的东西会更优雅:
df.iloc[(10:12, 25:28)]
Run Code Online (Sandbox Code Playgroud)
谢谢!