【问题标题】:How can I measure the length of a long string in Ruby? SciTE and command prompt aren't working.如何在 Ruby 中测量长字符串的长度? SciTE 和命令提示符不起作用。
【发布时间】:2011-09-29 17:57:37
【问题描述】:

我编写了一个程序来测量我的打字速度。作为其中的一部分,我需要它来计算我输入了多少个字符。我是这样做的

text = gets.chomp
puts text.length.to_s

不幸的是,我不能让这个工作很长的字符串。

在 SciTE 编辑器中,.length 无法正常工作,因此它不会给我字符串的长度,而是给我我输入的所有内容的字符数,包括更正的错误 - 如果我输入“Hrello”并将其更正为“Hello”,它仍然会返回 6 而不是 5。

我用谷歌搜索了这个,建议的解决方法是从命令提示符运行程序。在命令提示符下,.length 可以正常工作,但事实证明我不能输入超过 264 个字符。

所以我尝试用 Shoes 为程序添加 GUI:

Shoes.app :width => 300, :height => 300 do
    button "Start." do
        text = ask "Type here."
        para text.length.to_s
    end
end

发现鞋子的输入框字符限制更短。

我正在运行 Windows 7、Ruby 1.9.2、SciTe 版本 2.29 和 Shoes Policeman Revision 1514。

我怎样才能运行这个程序,这样它才能正确测量一个很长的字符串的长度?我会对任何修复命令提示符或鞋子字符限制、SciTE 错误或只是建议以不同方式执行 ruby​​ 程序的解决方案感到满意。

【问题讨论】:

    标签: ruby shoes


    【解决方案1】:

    我会很高兴 [...] 提出一种不同的方法来执行 ruby​​ 程序的建议。

    一个简单的网络应用怎么样?这是一个简单的 Sinatra 应用程序,它通过非常大的字符限制完成了您所要求的任务。

    require 'sinatra'
    
    get '/' do
      %{<html>
          <body>
            <form method="post">
              <textarea name="typed"></textarea>
              <input type="submit">
            </form>
          </body>
        </html>
      }
    end
    
    post '/' do
      "You typed #{params['typed'].length} characters."
    end
    

    要运行应用程序,您可以使用像ruby sinatra_example.rb 这样简单的东西来使用内置网络服务器。或者,您可以使用多个 Web 服务器中的任何一个来部署此应用程序。

    如果您需要计时器,这应该很容易通过 javascript 完成并包含在表单提交中。

    【讨论】:

      【解决方案2】:

      好的,您的问题标题不准确,但让我们看看:

      使用命令提示符的选项非常广泛,您应该考虑在其上运行一个简单的 ruby​​ 脚本。

      在 Windows 的命令行中,尝试输入 ruby​​ C:/path_to_folder_program/program.rb

      如果它不会执行,您可以在 ruby​​ 文件夹中找到一个名为 ruby​​ 的可执行文件,并且应该从该路径上的命令提示符中像上面一样运行它。

      但是让我问你,为什么是红宝石?其他更易于访问和用户友好的编程语言(例如 javascript)会表现得更好,并且更容易使您的程序易于访问。

      【讨论】:

      • 随意编辑我的标题 - 我不确定它到底有什么问题?我使用 Ruby 是因为它被推荐给我作为一种对初学者友好的多功能编程语言,到目前为止,它主要是 - Javascript 以更难学习而闻名。我计划接下来解决这个问题,但我想先掌握 Ruby。会试试你的建议,谢谢。
      【解决方案3】:

      - 编辑-
      似乎鞋子可以处理更多字符,使用edit_box 而不是ask:

      穿鞋:

      Shoes.app do
          @txt = edit_box
          button("How many"){ alert(@txt.text.size) }
      end
      

      无论如何,在试鞋之前,我做了我知道的练习,这里是:

      在 javascript 中:

      <script>
      function start_stop(){
          var txt = document.getElementById('txt');
          var btn = document.getElementById('btn');
          if( txt.disabled ){
              txt.value = '';
              txt.disabled = false;
              btn.value = 'Stop';
              txt.focus();
              startTime = new Date().getSeconds();
          } else {
              txt.disabled = true;
              btn.value = 'Start again';
              timeNow = new Date().getSeconds();
              alert(txt.value.length + " characters in " + (timeNow - startTime) + " seconds.");
          }
      }
      </script>
      <input type='button' id='btn' onclick='start_stop()' value='Start'>
      <textarea id='txt' rows='8' cols='80' disabled></textarea>
      

      在 Ruby 中使用 Qt:(复制与 javascript 中相同的想法)

      require 'Qt'
      
      class MyWidget < Qt::Widget
          slots :start_stop
          def initialize
              super
              setFixedSize(400, 120)
      
              @btn = Qt::PushButton.new("Start")
              @txt = Qt::TextEdit.new ; @txt.readOnly = true
      
              vbox =  Qt::VBoxLayout.new
              vbox.addWidget @btn
              vbox.addWidget @txt
              setLayout vbox
      
              connect(@btn, SIGNAL("clicked()"), self, SLOT(:start_stop))
          end
          def start_stop
              if @txt.readOnly
                  @txt.plainText = ''
                  @txt.readOnly = false
                  @btn.text = "Stop"
                  @txt.setFocus
                  @startTime = Time.now
              else
                  @txt.readOnly = true
                  @btn.text = "Start again (#{@txt.plainText.size} chars #{(Time.now - @startTime).to_i} in seconds)"
              end
          end
      end
      
      app = Qt::Application.new(ARGV)
      widget = MyWidget.new
      widget.show
      app.exec
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-11
        • 1970-01-01
        • 1970-01-01
        • 2021-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多