小编Gra*_*ean的帖子

如何在Ruby中动态改变继承

我想在Ruby中动态指定类的父类.考虑以下代码:

class Agent
  def self.hook_up(calling_class, desired_parent_class)
    # Do some magic here
  end
end

class Parent
  def bar
    puts "bar"
  end
end

class Child
  def foo
    puts "foo"
  end

  Agent.hook_up(self, Parent)
end

Child.new.bar
Run Code Online (Sandbox Code Playgroud)

类和定义都Parent没有Child指定父类,所以它们都从Object继承.我的第一个问题是:Agent.hook_up为了制作Parent超类,我需要做些什么Child(例如Child对象可以继承'bar'方法).

我的第二个问题是:我是否需要传递第一个参数Agent.hook_up,或者是否有某种hook_up方法可以通过编程方式确定调用它的类?

ruby metaprogramming

11
推荐指数
2
解决办法
8924
查看次数

我应该将超长UTF-8字符串转换为最短的正常形式吗?

我刚刚修改了我的Encoding :: FixLatin Perl模块来处理超长的UTF-8字节序列并将它们转换为最短的正常形式.

我的问题很简单" 这是一个坏主意 "吗?

许多来源(包括此RFC)表明,任何超长的UTF-8都应被视为错误并被拒绝.他们警告不要"天真的实施",并让我觉得这些东西本质上是不安全的.

由于我的模块的整个目的是用混合编码清理凌乱的数据文件并将它们转换为漂亮干净的utf8,这似乎只是我可以清理的一件事,因此应用程序层不必处理它.我的代码并不关心结果字符可能具有的任何语义含义,它只是将它们转换为规范化形式.

我错过了什么.我没有考虑过隐藏的危险吗?

security perl encoding utf-8

9
推荐指数
1
解决办法
732
查看次数

迭代哈希引用是否需要在perl中隐式复制它?

假设我有一个大哈希,我想迭代它的内容.标准的习语是这样的:

while(($key, $value) = each(%{$hash_ref})){
   ///do something
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我理解我的perl,这实际上是做了两件事.首先是

%{$hash_ref}
Run Code Online (Sandbox Code Playgroud)

正在将ref翻译成列表上下文.因此返回类似的东西

(key1, value1, key2, value2, key3, value3 etc)
Run Code Online (Sandbox Code Playgroud)

它将存储在我的堆栈内存中.然后每个方法都会运行,在内存中使用前两个值(key1和value1)并将它们返回到我的while循环进行处理.

如果我对此的理解是正确的,这意味着我已经有效地将我的整个哈希复制到我的堆栈内存中,只是迭代新的副本,这对于大型哈希来说可能是昂贵的,因为迭代数组两次的费用,但是如果两个哈希值都不能同时保存在内存中,也会导致潜在的缓存命中.看起来效率很低.我想知道这是不是真的发生了,或者我是否误解了实际行为,或者编译器是否为我的效率低下了?

跟进问题,假设我对标准行为是正确的.

  1. 是否有一种语法可以避免通过在原始哈希中迭代它来复制哈希值?如果不是哈希那么更简单的数组呢?

  2. 这是否意味着在上面的示例中,如果我修改了循环中的hash_ref内容,我可能会在哈希副本和实际哈希值之间得到不一致的值; 导致$ value具有不同的值,然后$ hash_ref - >($ key)?

perl hash

6
推荐指数
2
解决办法
171
查看次数

为什么要在RecyclerView.ViewHolder中使用static

为什么推荐使用staticclass扩展从RecyclerView.ViewHolder,如果我创建这个类的一个新的实例onCreateViewHolder方法,我想该实例用于每个项目:

@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recyclerview,parent,false);
    return new RecyclerViewAdapter.RecyclerViewHolder(view);
}

@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {

    String textTop = noticias.get(position).getHora()+ noticias.get(position).getTemperatura();

    holder.textViewTop.setText(textTop);
    holder.textViewBot.setText(noticias.get(position).getTexto());

}


public static class RecyclerViewHolder extends RecyclerView.ViewHolder{

    public TextView textViewTop;
    public TextView textViewBot;

    public RecyclerViewHolder(View view){
        super(view);
        textViewTop = (TextView) view.findViewById(R.id.textView4);
        textViewBot = (TextView) view.findViewById(R.id.textView5);
    }

}
Run Code Online (Sandbox Code Playgroud)

android android-viewholder recycler-adapter android-recyclerview

5
推荐指数
1
解决办法
3284
查看次数

如何用双引号键入数组的选定元素

在这里,我试图用双引号打印数组的第2,第3和第4个元素,我只能用单引号来完成.

my @fruits = ("apples", "oranges", "guavas", "passionfruits", "grapes");
my $a = 1;
while ($a<4){
    print " '$fruits[$a]' \n";
    $a += 1;
}
Run Code Online (Sandbox Code Playgroud)

但我不能用单引号做到这一点.当我将单引号更改为双引号时,反之亦然,它会打印"$fruits[$a]"\n三次.当我将所有引号更改为双引号时,它会给出一个我理解为什么的错误.我真的需要帮助.

如果我能用双引号打印所有三个元素而不必使用循环.谢谢!

arrays perl

3
推荐指数
1
解决办法
110
查看次数

在 Perl 脚本中打开行的长度

我想在 Perl 中使用 switch/case 构造。我有一个包含单词序列的文件,我想根据该行包含的单词数对每一行进行不同的处理。

一个示例文件:

w1 w2 w2
w1 w3
Run Code Online (Sandbox Code Playgroud)

所以脚本看起来像这样,但我如何计算每行中的单词数?

given ($number_of_word_in_line) {
   when ($_ > 2) {
       ...
   }
   when ($_ > 3) {
       ...
   }
   default {
       ...
   }
}
Run Code Online (Sandbox Code Playgroud)

perl

2
推荐指数
1
解决办法
76
查看次数

Vim 正则表达式 - 替换十六进制字符?

我想对 Vim 中的一系列行进行全局替换:

:s/pattern/replacement/g
Run Code Online (Sandbox Code Playgroud)

“模式”是一组中的一个字符,例如[BEINS],“替换”是单个字符。然而,问题在于单个字符是作为 ASCII/Unicode 字符的 2 位十六进制表示形式提供给我的。显然,我可以查找十六进制 ASCII 图表以查看例如5F下划线字符,然后我可以输入_正则表达式的替换部分。

有没有办法在正则表达式的右侧输入十六进制?

我尝试过但不起作用的事情包括:

:%s/[BEINS]/\x5F/g
:%s/[BEINS]/\\x5F/g
Run Code Online (Sandbox Code Playgroud)

在我的Linux工作站就可以输入:Ctrl- Shift-U然后是十六进制代码之后Enter,但我在想,如果有一个Vim特定的方式把十六进制的正则表达式的替换零件。

regex vim ascii

1
推荐指数
1
解决办法
1834
查看次数