- •Programming Ruby The Pragmatic Programmer's Guide
- •Foreword
- •Preface
- •Ruby Sparkles
- •What Kind of Language Is Ruby?
- •Is Ruby for Me?
- •Why Did We Write This Book?
- •Ruby Versions
- •Installing Ruby
- •Building Ruby
- •Running Ruby
- •Interactive Ruby
- •Ruby Programs
- •Resources
- •Acknowledgments
- •Notation Conventions
- •Roadmap
- •Ruby.New
- •Ruby Is an Object-Oriented Language
- •Some Basic Ruby
- •Arrays and Hashes
- •Control Structures
- •Regular Expressions
- •Blocks and Iterators
- •Reading and 'Riting
- •Onward and Upward
- •Classes, Objects, and Variables
- •Inheritance and Messages
- •Inheritance and Mixins
- •Objects and Attributes
- •Writable Attributes
- •Virtual Attributes
- •Class Variables and Class Methods
- •Class Variables
- •Class Methods
- •Singletons and Other Constructors
- •Access Control
- •Specifying Access Control
- •Variables
- •Containers, Blocks, and Iterators
- •Containers
- •Implementing a SongList Container
- •Blocks and Iterators
- •Implementing Iterators
- •Blocks for Transactions
- •Blocks Can Be Closures
- •Standard Types
- •Numbers
- •Strings
- •Working with Strings
- •Ranges as Sequences
- •Ranges as Conditions
- •Ranges as Intervals
- •Regular Expressions
- •Patterns
- •Anchors
- •Character Classes
- •Repetition
- •Alternation
- •Grouping
- •Pattern-Based Substitution
- •Backslash Sequences in the Substitution
- •Object-Oriented Regular Expressions
- •More About Methods
- •Defining a Method
- •Variable-Length Argument Lists
- •Methods and Blocks
- •Calling a Method
- •Expanding Arrays in Method Calls
- •Making Blocks More Dynamic
- •Collecting Hash Arguments
- •Expressions
- •Operator Expressions
- •Miscellaneous Expressions
- •Command Expansion
- •Backquotes Are Soft
- •Assignment
- •Parallel Assignment
- •Nested Assignments
- •Other Forms of Assignment
- •Conditional Execution
- •Boolean Expressions
- •Defined?, And, Or, and Not
- •If and Unless Expressions
- •If and Unless Modifiers
- •Case Expressions
- •Iterators
- •Break, Redo, and Next
- •Variable Scope and Loops
- •Exceptions, Catch, and Throw
- •The Exception Class
- •Handling Exceptions
- •Tidying Up
- •Play It Again
- •Raising Exceptions
- •Adding Information to Exceptions
- •Catch and Throw
- •Modules
- •Namespaces
- •Instance Variables in Mixins
- •Iterators and the Enumerable Module
- •Including Other Files
- •Basic Input and Output
- •What Is an io Object?
- •Opening and Closing Files
- •Reading and Writing Files
- •Iterators for Reading
- •Writing to Files
- •Talking to Networks
- •Threads and Processes
- •Multithreading
- •Creating Ruby Threads
- •Manipulating Threads
- •Thread Variables
- •Threads and Exceptions
- •Controlling the Thread Scheduler
- •Mutual Exclusion
- •The Mutex Class
- •Condition Variables
- •Running Multiple Processes
- •Spawning New Processes
- •Independent Children
- •Blocks and Subprocesses
- •When Trouble Strikes
- •Ruby Debugger
- •Interactive Ruby
- •Editor Support
- •But It Doesn't Work!
- •But It's Too Slow!
- •Create Locals Outside Blocks
- •Use the Profiler
- •Ruby and Its World
- •Command-Line Arguments
- •Command-Line Options
- •Program Termination
- •Environment Variables
- •Writing to Environment Variables
- •Where Ruby Finds Its Modules
- •Build Environment
- •Ruby and the Web
- •Writing cgi Scripts
- •Using cgi.Rb
- •Quoting
- •Creating Forms and html
- •Cookies
- •Sessions
- •Embedding Ruby in html
- •Using eruby
- •Installing eruby in Apache
- •Improving Performance
- •Ruby Tk
- •Simple Tk Application
- •Widgets
- •Setting Widget Options
- •Getting Widget Data
- •Setting/Getting Options Dynamically
- •Sample Application
- •Binding Events
- •Scrolling
- •Just One More Thing
- •Translating from Perl/Tk Documentation
- •Object Creation
- •Running Ruby Under Windows
- •Windows Automation
- •Getting and Setting Properties
- •Named Arguments
- •For each
- •An Example
- •Optimizing
- •Extending Ruby
- •Ruby Objects in c
- •Value as a Pointer
- •Value as an Immediate Object
- •Writing Ruby in c
- •Evaluating Ruby Expressions in c
- •Sharing Data Between Ruby and c
- •Directly Sharing Variables
- •Wrapping c Structures
- •An Example
- •Memory Allocation
- •Creating an Extension
- •Creating a Makefile with extconf.Rb
- •Static Linking
- •Embedding a Ruby Interpreter
- •Bridging Ruby to Other Languages
- •Ruby c Language api
- •The Ruby Language
- •Source Layout
- •Begin and end Blocks
- •General Delimited Input
- •The Basic Types
- •Integer and Floating Point Numbers
- •Strings
- •Requirements for a Hash Key
- •Symbols
- •Regular Expressions
- •Regular Expression Options
- •Regular Expression Patterns
- •Substitutions
- •Extensions
- •Variable/Method Ambiguity
- •Variables and Constants
- •Scope of Constants and Variables
- •Predefined Variables
- •Exception Information
- •Pattern Matching Variables
- •Input/Output Variables
- •Execution Environment Variables
- •Standard Objects
- •Global Constants
- •Expressions Single Terms
- •Operator Expressions
- •More on Assignment
- •Parallel Assignment
- •Block Expressions
- •Boolean Expressions
- •Truth Values
- •And, Or, Not, and Defined?
- •Comparison Operators
- •Ranges in Boolean Expressions
- •Regular Expressions in Boolean Expressions
- •While and Until Modifiers
- •Break, Redo, Next, and Retry
- •Method Definition
- •Method Arguments
- •Invoking a Method
- •Class Definition
- •Creating Objects from Classes
- •Class Attribute Declarations
- •Module Definitions
- •Mixins---Including Modules
- •Module Functions
- •Access Control
- •Blocks, Closures, and Proc Objects
- •Proc Objects
- •Exceptions
- •Raising Exceptions
- •Handling Exceptions
- •Retrying a Block
- •Catch and Throw
- •Classes and Objects
- •How Classes and Objects Interact
- •Your Basic, Everyday Object
- •Object-Specific Classes
- •Mixin Modules
- •Extending Objects
- •Class and Module Definitions
- •Class Names Are Constants
- •Inheritance and Visibility
- •Freezing Objects
- •Locking Ruby in the Safe
- •Safe Levels
- •Tainted Objects
- •Reflection, ObjectSpace, and Distributed Ruby
- •Looking at Objects
- •Looking Inside Objects
- •Looking at Classes
- •Looking Inside Classes
- •Calling Methods Dynamically
- •Performance Considerations
- •System Hooks
- •Runtime Callbacks
- •Tracing Your Program's Execution
- •How Did We Get Here?
- •Marshaling and Distributed Ruby
- •Custom Serialization Strategy
- •Distributed Ruby
- •Compile Time? Runtime? Anytime!
- •Standard Library
Static Linking
Finally, if your system doesn't support dynamic linking, or if you have an extension module that you want to have statically linked into Ruby itself, edit the file ext/Setupin the distribution and add your directory to the list of extensions in the file, then rebuild Ruby. The extensions listed inSetupwill be statically linked into the Ruby executable. If you want to disable any dynamic linking, and link all extensions statically, editext/Setupto contain the following option.
option nodynamic |
Embedding a Ruby Interpreter
In addition to extending Ruby by adding C code, you can also turn the problem around and embed Ruby itself within your application. Here's an example.
#include "ruby.h"
main() { /* ... our own application stuff ... */ ruby_init(); ruby_script("embedded"); rb_load_file("start.rb"); while (1) { if (need_to_do_ruby) { ruby_run(); } /* ... run our app stuff */ } } |
To initialize the Ruby interpreter, you need to call ruby_init(). But on some platforms, you may need to take special steps before that:
#if defined(NT) NtInitialize(&argc, &argv); #endif #if defined(__MACOS__) && defined(__MWERKS__) argc = ccommand(&argv); #endif |
See main.cin the Ruby distribution for any other special defines or setup needed for your platform.
Embedded Ruby API | |
void |
ruby_init(") |
|
Sets up and initializes the interpreter. This function should be called before any other Ruby-related functions. |
void |
ruby_options(int argc, char **argv") |
|
Gives the Ruby interpreter the command-line options. |
void |
ruby_script(char *name") |
|
Sets the name of the Ruby script (and $0) toname. |
void |
rb_load_file(char *file") |
|
Loads the given file into the interpreter. |
void |
ruby_run(") |
|
Runs the interpreter. |
You need to take some special care with exception handling; any Ruby calls you make at this top level should be protected to catch exceptions and handle them cleanly. rb_protect,rb_rescue, and related functions are documented on page 192.
For an example of embedding a Ruby interpreter within another program, see also eruby, which is described beginning on page 147.
Bridging Ruby to Other Languages
So far, we've discussed extending Ruby by adding routines written in C. However, you can write extensions in just about any language, as long as you can bridge the two languages with C. Almost anything is possible, including awkward marriages of Ruby and C++, Ruby and Java, and so on.
But you may be able to accomplish the same thing without resorting to C code. For example, you could bridge to other languages using middleware such as CORBA or COM. See the section on Windows automation beginning on page 164 for more details.
Ruby c Language api
Last, but by no means least, here are several C-level functions that you may find useful when writing an extension.
Some functions require an ID: you can obtain anIDfor a string by usingrb_internand reconstruct the name from anIDby usingrb_id2name.
As most of these C functions have Ruby equivalents that are already described in detail elsewhere in this book, the descriptions here will be brief.
Also note that the following listing is not complete. There are many more functions available---too many to document them all, as it turns out. If you need a method that you can't find here, check ``ruby.h'' or ``intern.h'' for likely candidates. Also, at or near the bottom of each source file is a set of method definitions that describe the binding from Ruby methods to C functions. You may be able to call the C function directly, or search for a wrapper function that calls the function you are looking for. The following list, based on the list inREADME.EXT, shows the main source files in the interpreter.
Ruby Language Core
class.c error.c eval.c gc.c object.c parse.y variable.c
Utility Functions
dln.c regex.c st.c util.c
Ruby Interpreter
dmyext.c inits.c keywords main.c ruby.c version.c
Base Library
array.c bignum.c compar.c dir.c enum.c file.c hash.c io.c marshal.c math.c numeric.c pack.c prec.c process.c random.c range.c re.c signal.c sprintf.c string.c struct.c time.c
Defining Objects | |
VALUE |
rb_define_class(char *name, VALUE superclass") |
|
Defines a new class at the top level with the given nameandsuperclass(for classObject, userb_cObject). |
VALUE |
rb_define_module(char *name") |
|
Defines a new module at the top level with the given name. |
VALUE |
rb_define_class_under(VALUE under, char *name, VALUE superclass") |
|
Defines a nested class under the class or module under. |
VALUE |
rb_define_module_under(VALUE under, char *name") |
|
Defines a nested module under the class or module under. |
void |
rb_include_module(VALUE parent, VALUE module") |
|
Includes the given moduleinto the class or moduleparent. |
void |
rb_extend_object(VALUE obj, VALUE module") |
|
Extends objwithmodule. |
VALUE |
rb_require(const char *name") |
|
Equivalent to ``requirename.'' ReturnsQtrueorQfalse. |
In some of the function definitions that follow, the parameter argcspecifies how many arguments a Ruby method takes. It may have the following values.
argc |
Function prototype |
0..17 |
VALUE func(VALUE self, VALUE arg...) |
|
The C function will be called with this many actual arguments. |
-1 |
VALUE func(int argc, VALUE *argv, VALUE self) |
|
The C function will be given a variable number of arguments passed as a C array. |
-2 |
VALUE func(VALUE self, VALUE args) |
|
The C function will be given a variable number of arguments passed as a Ruby array. |
In a function that has been given a variable number of arguments, you can use the C function rb_scan_argsto sort things out (see below).
Defining Methods | ||
void |
rb_define_method(VALUE classmod, char *name, VALUE(*func)(), int argc") | |
|
Defines an instance method in the class or module classmodwith the givenname, implemented by the C functionfuncand takingargcarguments. | |
void |
rb_define_module_function(VALUE classmod, char *name, VALUE(*func)(), int argc)") | |
|
Defines a method in class classmodwith the givenname, implemented by the C functionfuncand takingargcarguments. | |
void |
rb_define_global_function(char *name, VALUE(*func)(), int argc") | |
|
Defines a global function (a private method of Kernel) with the givenname, implemented by the C functionfuncand takingargcarguments. | |
void |
rb_define_singleton_method(VALUE classmod, char *name, VALUE(*func)(), int argc") | |
|
Defines a singleton method in class classmodwith the givenname, implemented by the C functionfuncand takingargcarguments. | |
int |
rb_scan_args(int argcount, VALUE *argv, char *fmt, ...") | |
|
Scans the argument list and assigns to variables similar to scanf:fmtis a string containing zero, one, or two digits followed by some flag characters. The first digit indicates the count of mandatory arguments; the second is the count of optional arguments. A ``*'' means to pack the rest of the arguments into a Ruby array. A ``&'' means that an attached code block will be taken and assigned to the given variable (if no code block was given,Qnilwill be assigned). After thefmtstring, pointers toVALUEare given (as withscanf) to which the arguments are assigned.
| |
void |
rb_undef_method(VALUE classmod, const char *name") | |
|
Undefines the given method namein the givenclassmodclass or module. | |
void |
rb_define_alias(VALUE classmod, const char *newname, const char *oldname") | |
|
Defines an alias for oldnamein class or moduleclassmod. |
Defining Variables and Constants | ||
void |
rb_define_const(VALUE classmod, char *name, VALUE value") | |
|
Defines a constant in the class or module classmod, with the givennameandvalue. | |
void |
rb_define_global_const(char *name, VALUE value") | |
|
Defines a global constant with the given nameandvalue. | |
void |
rb_define_variable(const char *name, VALUE *object") | |
|
Exports the address of the given objectthat was created in C to the Ruby namespace asname. From Ruby, this will be a global variable, sonameshould start with a leading dollar sign. Be sure to honor Ruby's rules for allowed variable names; illegally named variables will not be accessible from Ruby. | |
void |
rb_define_class_variable(VALUE class, const char *name, VALUE val") | |
|
Defines a class variable name(which must be specified with a ``@@'' prefix) in the givenclass, initialized tovalue. | |
void |
rb_define_virtual_variable(const char *name, VALUE(*getter)(), void(*setter)()") | |
|
Exports a virtual variable to Ruby namespace as the global $name. No actual storage exists for the variable; attempts to get and set the value will call the given functions with the prototypes:
You will likely not need to use the entryparameter and can safely omit it from your function declarations. | |
void |
rb_define_hooked_variable(const char *name, VALUE *variable, VALUE(*getter)(), void(*setter)()") | |
|
Defines functions to be called when reading or writing to variable. See alsorb_define_virtual_variable. | |
void |
rb_define_readonly_variable(const char *name, VALUE *value") | |
|
Same as rb_define_variable, but read-only from Ruby. | |
void |
rb_define_attr(VALUE variable, const char *name, int read, int write") | |
|
Creates accessor methods for the given variable, with the givenname. Ifreadis nonzero, create a read method; ifwriteis nonzero, create a write method. | |
void |
rb_global_variable(VALUE *obj") | |
|
Registers the given address with the garbage collector. |
Calling Methods | |
VALUE |
rb_funcall(VALUE recv, ID id, int argc, ...") |
|
Invokes the method given by idin the objectrecvwith the given number of argumentsargcand the arguments themselves (possibly none). |
VALUE |
rb_funcall2(VALUE recv, ID id, int argc, VALUE *args") |
|
Invokes the method given by idin the objectrecvwith the given number of argumentsargcand the arguments themselves given in the C arrayargs. |
VALUE |
rb_funcall3(VALUE recv, ID id, int argc, VALUE *args") |
|
Same as rb_funcall2, but will not call private methods. |
VALUE |
rb_apply(VALUE recv, ID name, int argc, VALUE args") |
|
Invokes the method given by idin the objectrecvwith the given number of argumentsargcand the arguments themselves given in the RubyArrayargs. |
ID |
rb_intern(char *name") |
|
Returns an IDfor a givenname. If the name does not exist, a symbol table entry will be created for it. |
char * |
rb_id2name(ID id") |
|
Returns a name for the given id. |
VALUE |
rb_call_super(int argc, VALUE *args") |
|
Calls the current method in the superclass of the current object. |
Exceptions | |
void |
rb_raise(VALUE exception, const char *fmt, ...") |
|
Raises an exception. The given stringfmtand remaining arguments are interpreted as withprintf. |
void |
rb_fatal(const char *fmt, ...") |
|
Raises a Fatalexception, terminating the process. No rescue blocks are called, but ensure blocks will be called. The given stringfmtand remaining arguments are interpreted as withprintf. |
void |
rb_bug(const char *fmt, ...") |
|
Terminates the process immediately---no handlers of any sort will be called. The given string fmtand remaining arguments are interpreted as withprintf. You should call this function only if a fatal bug has been exposed. You don't write fatal bugs, do you? |
void |
rb_sys_fail(const char *msg") |
|
Raises a platform-specific exception corresponding to the last known system error, with the given msg. |
VALUE |
rb_rescue(VALUE (*body)(), VALUE args, VALUE(*rescue)(), VALUE rargs") |
|
Executes bodywith the givenargs. If aStandardErrorexception is raised, then executerescuewith the givenrargs. |
VALUE |
rb_ensure(VALUE(*body)(), VALUE args, VALUE(*ensure)(), VALUE eargs") |
|
Executes bodywith the givenargs. Whether or not an exception is raised, executeensurewith the givenrargsafterbodyhas completed. |
VALUE |
rb_protect(VALUE (*body)(), VALUE args, int *result") |
|
Executes bodywith the givenargsand returns nonzero inresultif any exception was raised. |
void |
rb_notimplement(") |
|
Raises a NotImpErrorexception to indicate that the enclosed function is not implemented yet, or not available on this platform. |
void |
rb_exit(int status") |
|
Exits Ruby with the given status. Raises aSystemExitexception and calls registered exit functions and finalizers. |
void |
rb_warn(const char *fmt, ...") |
|
Unconditionally issues a warning message to standard error. The given string fmtand remaining arguments are interpreted as withprintf. |
void |
rb_warning(const char *fmt, ...") |
|
Conditionally issues a warning message to standard error if Ruby was invoked with the -wflag. The given stringfmtand remaining arguments are interpreted as withprintf. |
Iterators | |
void |
rb_iter_break(") |
|
Breaks out of the enclosing iterator block. |
VALUE |
rb_each(VALUE obj") |
|
Invokes the eachmethod of the givenobj. |
VALUE |
rb_yield(VALUE arg") |
|
Transfers execution to the iterator block in the current context, passing argas an argument. Multiple values may be passed in an array. |
int |
rb_block_given_p(") |
|
Returns true if yieldwould execute a block in the current context---that is, if a code block was passed to the current method and is available to be called. |
VALUE |
rb_iterate(VALUE (*method)(), VALUE args, VALUE (*block)(), VALUE arg2") |
|
Invokes methodwith argumentargsand blockblock. Ayieldfrom that method will invokeblockwith the argument given toyield, and a second argumentarg2. |
VALUE |
rb_catch(const char *tag, VALUE (*proc)(), VALUE value") |
|
Equivalent to Ruby catch. |
void |
rb_throw(const char *tag , VALUE value") |
|
Equivalent to Ruby throw. |
Accessing Variables | |
VALUE |
rb_iv_get(VALUE obj, char *name") |
|
Returns the instance variable name(which must be specified with a ``@'' prefix) from the givenobj. |
VALUE |
rb_ivar_get(VALUE obj, ID name") |
|
Returns the instance variable namefrom the givenobj. |
VALUE |
rb_iv_set(VALUE obj, char *name, VALUE value") |
|
Sets the value of the instance variable name(which must be specified with a ``@'' prefix) in the givenobjtovalue. Returnsvalue. |
VALUE |
rb_ivar_set(VALUE obj, ID name, VALUE value") |
|
Sets the value of the instance variable namein the givenobjtovalue. Returnsvalue. |
VALUE |
rb_gv_set(const char *name, VALUE value") |
|
Sets the global variable name(the ``$'' prefix is optional) tovalue. Returnsvalue. |
VALUE |
rb_gv_get(const char *name") |
|
Returns the global variable name(the ``$'' prefix is optional). |
void |
rb_cvar_set(VALUE class, ID name, VALUE val") |
|
Sets the class variable namein the givenclasstovalue. |
VALUE |
rb_cvar_get(VALUE class, ID name") |
|
Returns the class variable namefrom the givenclass. |
int |
rb_cvar_defined(VALUE class, ID name") |
|
Returns Qtrueif the given class variablenamehas been defined forclass; otherwise, returnsQfalse. |
void |
rb_cv_set(VALUE class, const char *name, VALUE val") |
|
Sets the class variable name(which must be specified with a ``@@'' prefix) in the givenclasstovalue. |
VALUE |
rb_cv_get(VALUE class, const char *name") |
|
Returns the class variable name(which must be specified with a ``@@'' prefix) from the givenclass. |
Object Status | |
|
OBJ_TAINT(VALUE obj") |
|
Marks the given objas tainted. |
int |
OBJ_TAINTED(VALUE obj") |
|
Returns nonzero if the given objis tainted. |
|
OBJ_FREEZE(VALUE obj") |
|
Marks the given objas frozen. |
int |
OBJ_FROZEN(VALUE obj") |
|
Returns nonzero if the given objis frozen. |
|
Check_SafeStr(VALUE str") |
|
Raises SecurityErrorif current safe level > 0 andstris tainted, or aTypeErrorifstris not aT_STRING. |
int |
rb_safe_level(") |
|
Returns the current safe level. |
void |
rb_secure(int level") |
|
Raises SecurityErroriflevel<= current safe level. |
void |
rb_set_safe_level(int newlevel") |
|
Sets the current safe level to newlevel. |
Commonly Used Methods | |
VALUE |
rb_ary_new(") |
|
Returns a new Arraywith default size. |
VALUE |
rb_ary_new2(long length") |
|
Returns a new Arrayof the givenlength. |
VALUE |
rb_ary_new3(long length, ...") |
|
Returns a new Arrayof the givenlengthand populated with the remaining arguments. |
VALUE |
rb_ary_new4(long length, VALUE *values") |
|
Returns a new Arrayof the givenlengthand populated with the C arrayvalues. |
void |
rb_ary_store(VALUE self, long index, VALUE value") |
|
Stores valueatindexin arrayself. |
VALUE |
rb_ary_push(VALUE self, VALUE value") |
|
Pushes valueonto the end of arrayself. Returnsvalue. |
VALUE |
rb_ary_pop(VALUE self") |
|
Removes and returns the last element from the array self. |
VALUE |
rb_ary_shift(VALUE self") |
|
Removes and returns the first element from the array self. |
VALUE |
rb_ary_unshift(VALUE self, VALUE value") |
|
Pushes valueonto the front of arrayself. Returnsvalue. |
VALUE |
rb_ary_entry(VALUE self, long index") |
|
Returns array self's element atindex. |
int |
rb_respond_to(VALUE self, ID method") |
|
Returns nonzero if selfresponds tomethod. |
VALUE |
rb_thread_create(VALUE (*func)(), void *data") |
|
Runs funcin a new thread, passingdataas an argument. |
VALUE |
rb_hash_new(") |
|
Returns a new, empty Hash. |
VALUE |
rb_hash_aref(VALUE self, VALUE key") |
|
Returns the element corresponding to keyinself. |
VALUE |
rb_hash_aset(VALUE self, VALUE key, VALUE value") |
|
Sets the value for keytovalueinself. Returnsvalue. |
VALUE |
rb_obj_is_instance_of(VALUE obj, VALUE klass") |
|
Returns Qtrueifobjis an instance ofklass. |
VALUE |
rb_obj_is_kind_of(VALUE obj, VALUE klass") |
|
Returns Qtrueifklassis the class ofobjorclassis one of the superclasses of the class ofobj. |
VALUE |
rb_str_new(const char *src, long length") |
|
Returns a new Stringinitialized withlengthcharacters fromsrc. |
VALUE |
rb_str_new2(const char *src") |
|
Returns a new Stringinitialized with the null-terminated C stringsrc. |
VALUE |
rb_str_dup(VALUE str") |
|
Returns a new Stringobject duplicated fromstr. |
VALUE |
rb_str_cat(VALUE self, const char *src, long length") |
|
Concatenates lengthcharacters fromsrconto theStringself. Returnsself. |
VALUE |
rb_str_concat(VALUE self, VALUE other") |
|
Concatenates otheronto theStringself. Returnsself. |
VALUE |
rb_str_split(VALUE self, const char *delim") |
|
Returns an array of Stringobjects created by splittingselfondelim. |